1

我正在使用chai.jsmocha JS 测试框架的期望。我正在尝试测试在数组中包含对象,但似乎includeschai 在他们的文档中支持的行为不像我预期的那样工作:

柴网站上的例子是这样说

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)

我究竟做错了什么?

4

1 回答 1

1

根据文档:

当目标是一个数组时,.include断言给定val的是目标的成员。

显然,数组的成员[{a: 1}]和匹配{a: 1}对象是两个不同的对象。因此匹配者不是目标的成员。另一方面,原语是使用它们的值而不是它们的引用来匹配的。因此,以下断言通过:

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

或者,您可以像这样深入检查目标数组:

expect([{a: 1}]).to.deep.include({a: 1});
于 2018-03-28T17:02:50.450 回答