chai eql报告相同的数组不同

时间:2014-11-20 08:30:47

标签: javascript arrays mongodb mocha chai

我在node.js程序中测试一个函数,它应该将一些数据保存到mongo数据库中。我正在使用摩卡,柴和应该。

在架构中,我已将数据定义为

data: [{type: Number, min: 0}]

测试将数组[1,2,3,4,5,6]保存到数据库,然后再次find,并将它找到的内容与保存的数组进行比较。测试是

result.data.should.eql([1,2,3,4,5,6]);

测试结果是

Uncaught AssertionError: expected [1,2,3,4,5,6] 
to deeply equal [ 1, 2, 3, 4, 5, 6 ]

根据this chai.js example,以这种方式比较数组应该可以正常工作。

当我使用result.data.should.deep.include.members([1,2,3,4,5,6]);测试结果时,测试会按预期进行。

有人可以向我解释为什么这不起作用吗?

1 个答案:

答案 0 :(得分:8)

Mongoose用很多自己的方法装饰数组。当你执行console.log(result.data)时,你不会看到这些,但是deep-eql(Chai用来做深度相等的库)在进行比较时会考虑它们。这就是使用.eql()时测试失败的原因:您正在将特殊的Mongoose数组与普通的香草数组进行比较。

相反,如果你做了

result.data.toJSON().should.eql([1,2,3,4,5,6]);

你的测试会如期发出。

.members()断言经历different code path,这就是它恰好起作用的原因。

顺便说一下,适合你的例子并不能完全符合你的需要,它是一个超集测试。你真正想要的是:

result.data.should.have.members([1,2,3,4,5,6]);