91

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

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)

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

4

5 に答える 5

158

ジャスミン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})
    }));
});
于 2014-06-30T09:53:11.173 に答える
11

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

expect(Object.keys(myObject)).toContain('myKey');
于 2015-07-21T09:15:59.077 に答える
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;
        }
    });
});
于 2013-03-10T13:46:03.927 に答える
1

最新のJavaScriptマップとREST演算子を使用した代替案を提供すると思いました。rest演算子を使用したdestructuringを使用して、プロパティを省略することができます。この記事の詳細な説明を参照してください。

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

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

expect(rest).toEqual(example)
于 2018-08-01T20:24:36.313 に答える
1

jasmine.objectContaining()単一のレイヤーに対してのみ機能します。

expect(result).toMatchObject(example)渡されたオブジェクトの例が結果のプロパティのサブセットと一致することを確認します。

于 2021-07-06T22:51:40.383 に答える