为什么这个测试失败了?数组应等于 []

Why is this test failing? Array should equal []

我的测试,alerts 变量下面是一个空数组 [] 但是这会引发错误。

it('FeedFactory alerts array is filled', function() {
    var alerts = FeedFactory.returnAlerts();
    console.log('alerts',alerts);
    expect(alerts).to.equal([]);
});

这是我注释掉最后expect(alerts).to.equal([]);行时的测试日志。

我工厂的代码

var alerts = [];

var feedFactory = {
    alerts       : alerts,
    getFeed      : getFeed,
    returnAlerts : returnAlerts,
    saveFilters  : saveFilters,
    getFilters   : getFilters
};

function returnAlerts() {
    return alerts;
}

因为[] !== [] && [] != []。 JS 对象不是松散或严格相等的,所以 expect([]).to.equal([]) 总是会失败。

你应该使用更深层次的相等形式,例如deep (or its confusing shorthand, eql) or members:

expect([1, 2, 3]).to.deep.equal([1, 2, 3])
expect([1, 2, 3]).to.include.members([1, 2])

两个空数组彼此不相等,因为每个数组都有不同的引用,因为所有对象(以及与此相关的数组)都被引用而不是被复制。 检查对象是否相等是检查引用而不是内部内容

机会:

var a = [];
var b = [];
console.log(a == b) //false

我会使用警报数组的长度来测试它是否为空数组。通过写作:

expect(alerts.length).to.equal(0);

为了检查数组的内容是否等于另一个数组的另一个内容,您必须使用深度检查,检查数组的每个值是否等于另一个数组中的值(非常昂贵)。