为什么不包括检查在chai.js中按预期工作?

时间:2018-03-28 16:55:06

标签: javascript bdd assert chai expectations

我对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)

我做错了什么?

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