Chai测试数组相等性不能按预期工作

为什么下面的会失败?

expect([0,0]).to.equal([0,0]);

正确的测试方法是什么呢?

119436 次浏览

对于预计.equal将比较对象而不是它们的数据,在你的例子中,它是两个不同的数组。

使用.eql来深度比较值。检查这个链接.
或者你可以使用.deep.equal来模拟与.eql相同的结果 或者在你的情况下,你可能想要检查 .members.

对于断言,可以使用.deepEqual链接

尝试使用深度等号。它将比较嵌套数组和嵌套Json。

expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });

请参考主要文档站点

这是如何使用chai深入测试关联数组。

我有一个问题,试图断言两个联想数组是相等的。我知道这些不应该在javascript中使用,但我正在围绕遗留代码编写单元测试,它返回一个关联数组的引用。: -)

我通过在函数调用之前将变量定义为对象(而不是数组)来实现:

var myAssocArray = {};   // not []
var expectedAssocArray = {};  // not []


expectedAssocArray['myKey'] = 'something';
expectedAssocArray['differentKey'] = 'something else';


// legacy function which returns associate array reference
myFunction(myAssocArray);


assert.deepEqual(myAssocArray, expectedAssocArray,'compare two associative arrays');

你可以使用.deepEqual()

const { assert } = require('chai');


assert.deepEqual([0,0], [0,0]);
import chai from 'chai';
const arr1 = [2, 1];
const arr2 = [2, 1];
chai.expect(arr1).to.eql(arr2); // Will pass. `eql` is data compare instead of object compare.

对于无序深度相等,使用成员

expect([1,2,3]).to.have.members([3,2,1]); // passes expect([1,2,3]).to.have.members([1,2,3]); // passes expect([1,2,3]).to.eql([3,2,1]); // fails

source

你可以使用

https://www.chaijs.com/api/assert/#method_samedeepmembers

assert.sameDeepMembers(set1, set2, [message])

断言set1set2在任意顺序中具有相同的成员。使用深度相等检查。

assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members');