プロパティのサブセットでオブジェクトを比較するためのジャスミンマッチャーはありますか


84

テスト中の動作に沿って拡張できるオブジェクトがありますが、元のプロパティがまだそこにあることを確認したいと思います。

var example = {'foo':'bar', 'bar':'baz'}

var result = extendingPipeline(example)
// {'foo':'bar', 'bar':'baz', 'extension': Function}

expect(result).toEqual(example) //fails miserably

この場合、次の行に沿って通過するマッチャーが欲しいのですが。

expect(result).toInclude(example)

カスタムマッチャーを作成できることは知っていますが、これは非常に一般的な問題であるため、解決策はすでに存在しているはずです。どこで探すべきですか?


配列を比較しようとすると同様の問題が発生したため、別の回答で説明されているように配列を処理しないjasmine.objectContainingを直接使用できませんでした。最終的には、期待される結果でarray.mapを使用して、たとえば、これを代替案として検討するためにここに残しておきます。
ブランドンセーレンCulley

回答:


145

ジャスミン2.0

expect(result).toEqual(jasmine.objectContaining(example))

この修正:https//github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0以降 、ネストされたオブジェクトでも機能するため、部分的に一致させる各オブジェクトをラップする必要があります。jasmine.objectContaining()

簡単な例:

it('can match nested partial objects', function ()
{
    var joc = jasmine.objectContaining;
    expect({ 
        a: {x: 1, y: 2}, 
        b: 'hi' 
    }).toEqual(joc({
        a: joc({ x: 1})
    }));
});

異なる値と同様のキーを含むオブジェクトに対して同じことを行う方法はありますか?
Siva 2015

3
@ Siva-Object.keys(obj)オブジェクトの代わりにの結果を直接比較してみることができるかもしれませんか?
Kamil Szot 2015

11

私も同じ問題を抱えています。私はちょうどこのコードを試しました、それは私のために働きます:

expect(Object.keys(myObject)).toContain('myKey');

3
値が一致しない場合はtrueを返すため、これは問題に完全には対応していません。
のKnownColor

2

それほど一般的ではないと思いますし、見つけることもできないと思います。1つ書くだけです:

beforeEach(function () {
    this.addMatchers({
        toInclude: function (expected) {
            var failed;

            for (var i in expected) {
                if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) {
                    failed = [i, expected[i]];
                    break;
                }
            }

            if (undefined !== failed) {
                this.message = function() {
                    return 'Failed asserting that array includes element "'
                        + failed[0] + ' => ' + failed[1] + '"';
                };
                return false;
            }

            return true;
        }
    });
});

1

私は、最新のjavascriptマップとrest演算子を使用して代替案を提供すると思いました。レスト演算子を使用したデストラクチャリングを使用して、プロパティを省略することができます。この記事の詳細な説明を参照してください

var example = {'foo':'bar', 'bar':'baz'}

var { extension, ...rest } = extendingPipeline(example)

expect(rest).toEqual(example)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.