web-dev-qa-db-ja.com

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

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

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)

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

64
iwein

ジャスミン2.0

_expect(result).toEqual(jasmine.objectContaining(example))
_

この修正: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee ネストされたオブジェクトでも動作するため、部分的に一致させたい各オブジェクトを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})
    }));
});
_
118
Kamil Szot

私も同じ問題を抱えています。私はこのコードを試しましたが、私にとってはうまくいきます:

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

私はそれがそんなに一般的だとは思わないし、あなたがそれを見つけることができるとは思わない。 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
Wouter J

私は、最新のjavascriptマップとREST演算子を使用した代替手段を提供すると思いました。 rest演算子による破壊を使用して、プロパティを省略することができます。詳細は この記事 をご覧ください。

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

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

expect(rest).toEqual(example)