我有一个可以根据我的测试行为进行扩展的对象,但我想确保原始属性仍在那里。
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)
我知道我可以编写一个自定义匹配器,但在我看来,这是一个常见的问题,解决方案应该已经存在。我应该在哪里寻找它?
答案 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)
检查传入的对象示例是否与结果属性的子集匹配。