在柴中比较数组

时间:2015-11-16 15:34:44

标签: arrays node.js chai

我正在用chai和chai-as-promise(和更多的框架,但在这种情况下并不重要)编写一些测试,我需要检查我是否从网页获取数组与预定义的数组相同。我尝试使用expect(arrayFromPage).to.eventually.deep.equal(predefinedArray),但它不会起作用,因为页面上的元素顺序有时会有所不同(可以,我不需要检查它们是否处于相同的顺序)

我找到了一种使用expect(listFromPage).to.eventually.include.all.members(predefinedArray)解决问题的方法,但我想知道是否有更好的解决方案。

在我的解决方法中最让我困扰的是,我只确保predefinedArraylistFromPage的子集,而不是它们由相同的元素组成。

所以,我想知道是否有一个断言会传递给[1,2,3][3,2,1],但不会传递给[1][1,2,3]或{ {1}}和[1,2,3,4]

我知道我可以使用一些第二种期望(比较长度或其他东西),但我想知道是否有单线解决方案。

5 个答案:

答案 0 :(得分:19)

看到这被标记为先前解决,我尝试做了与接受的答案相同的事情。它可能在那时起作用,但似乎不再起作用了:

expect([1, 2, 3, 4]).to.have.all.members([2, 4, 3, 1]);

给出以下错误:

AssertionError: expected 1 to be an array

我做了一些研究,发现一个拉动请求,在2013年又添加了这个功能:

https://github.com/chaijs/chai/pull/153

所以现在这样做的官方方式是这样的:

expect([1, 2, 3, 4]).to.have.same.members([2, 4, 3, 1]);

为了完整性,这是两个不同集合产生的错误:

AssertionError: expected [ 1, 2, 3, 4 ] to have the same members as [ 4, 3, 1 ]

希望这可以帮助任何人现在搜索相同的答案。 : - )

答案 1 :(得分:4)

文档中并不完全清楚,但.to.have.all.members似乎有效。我只能在.keys中找到此功能的提及,但看起来它也适用于带有数组的.members

答案 2 :(得分:2)

您可以使用2行:

expect(listFromPage).to.eventually.include.all.members(predefinedArray)
expect(predefinedArray).to.eventually.include.all.members(listFromPage)

这样,您将检查两个数组是否包含相同的值。但顺序并不重要。

答案 3 :(得分:1)

从未来开始,对我有用的方法是使用 .deepEqual 为我做了诀窍

assert.deepEqual(['name'], ['name'], 'this must be same to proceed');

答案 4 :(得分:0)

.members 现在似乎是这样做的方法。

具体来说: have.membershave.deep.members

取决于您的需求。

https://www.chaijs.com/api/bdd/#method_members