chai eql报告相同的数组不同

lal*_*alo 2 javascript arrays mocha.js mongodb chai

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

在模式中,我已将数据定义为保存为

data: [{type: Number, min: 0}]
Run Code Online (Sandbox Code Playgroud)

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

result.data.should.eql([1,2,3,4,5,6]);
Run Code Online (Sandbox Code Playgroud)

测试结果是

Uncaught AssertionError: expected [1,2,3,4,5,6] 
to deeply equal [ 1, 2, 3, 4, 5, 6 ]
Run Code Online (Sandbox Code Playgroud)

根据这个chai.js示例,以这种方式比较数组应该可以正常工作.

当我测试结果时result.data.should.deep.include.members([1,2,3,4,5,6]);,测试通过预期.

任何人都可以向我解释为什么这不起作用?

小智 8

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

相反,如果你这样做了

result.data.toJSON().should.eql([1,2,3,4,5,6]);
Run Code Online (Sandbox Code Playgroud)

你的测试会像你期望的那样通过.

.members()说法经过一个不同的代码路径,这就是为什么它发生的工作.

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

result.data.should.have.members([1,2,3,4,5,6]);
Run Code Online (Sandbox Code Playgroud)