我对mocha JS测试框架使用chai.js
期望值。我试图在数组中测试对象的包含,但是在他们的文档中chai支持的includes
行为似乎并不像我期望的那样工作:
chai网站上的例子说this:
expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2});
按预期工作。但是,以下失败:
expect([{a: 1}]).to.be.an('array').and.include({a: 1})
错误:
(node:5639) ... AssertionError: expected [ { a: 1 } ] to include { a: 1 }
但这成功了:
expect([1,2]).to.be.an('array').and.include(1)
我做错了什么?
答案 0 :(得分:1)
根据文档:
当目标是数组时,
.include
断言给定的val
是目标的成员。
显然,数组[{a: 1}]
的成员和matchee {a: 1}
是两个不同的对象。因此,matchee不是目标的成员。另一方面,基元使用它们的值而不是它们的引用进行匹配。因此,以下断言通过:
expect([1,2]).to.be.an('array').and.include(1)
对于该对象,文档说:
当目标是一个对象时,
.include
断言给定对象val
的属性是目标属性的子集。
这意味着chai实际检查两个对象之间每个属性的值相似性。这也是断言传递到那里的原因。
要纠正此问题,您可以将变量声明一次,并在两个位置使用它:
var obj = {a: 1};
expect([obj]).to.be.an('array').and.include(obj);
或者,您可以在目标数组中deep check,如下所示:
expect([{a: 1}]).to.deep.include({a: 1});