是否有茉莉花匹配器来比较其属性子集上的对象

时间:2013-03-10 13:32:39

标签: javascript unit-testing jasmine

我有一个可以根据我的测试行为进行扩展的对象,但我想确保原始属性仍在那里。

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)

我知道我可以编写一个自定义匹配器,但在我看来,这是一个常见的问题,解决方案应该已经存在。我应该在哪里寻找它?

5 个答案:

答案 0 :(得分:111)

Jasmine 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})
    }));
});

答案 1 :(得分:9)

我遇到了同样的问题。我刚试过这段代码,它对我有用:

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

答案 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;
        }
    });
});

答案 3 :(得分:0)

我认为我将提供使用现代javascript映射和rest运算符的替代方法。我们可以使用带有rest运算符的解构来忽略属性。请参见this article中的进一步说明。

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

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

expect(rest).toEqual(example)

答案 4 :(得分:0)

jasmine.objectContaining() 仅适用于单个图层。

expect(result).toMatchObject(example) 检查传入的对象示例是否与结果属性的子集匹配。