我在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]);
测试结果时,测试会按预期进行。
有人可以向我解释为什么这不起作用吗?
答案 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]);