比较 chai 中的数组

问题描述 投票:0回答:6

我正在使用 chai 和 chai-as-promised (以及更多框架,但在这种情况下并不重要)编写一些测试,我需要检查从网页获取的数组是否与预定义的数组相同。我尝试使用

expect(arrayFromPage).to.eventually.deep.equal(predefinedArray)
,但它不起作用,因为页面上元素的顺序有时不同(这没关系,我不需要检查它们是否处于相同的顺序)。

我找到了一种使用

expect(listFromPage).to.eventually.include.all.members(predefinedArray)
解决该问题的方法,但我想知道是否有更好的解决方案。

在我的解决方法中最困扰我的是,我只保证

predefinedArray
listFromPage
的子集,而不是它们由相同的元素组成。

所以,我想知道是否有一个断言可以通过

[1,2,3]
[3,2,1]
,但不能通过
[1]
[1,2,3]
[1,2,3,4]
[1,2,3]

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

arrays node.js chai
6个回答
47
投票

鉴于此问题已被标记为已解决,因此我尝试执行与已接受答案中相同的操作。当时可能有效,但现在似乎不再有效:

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 ]

希望这对现在正在寻找相同答案的人有所帮助。 :-)


5
投票

文档中并不完全清楚,但

.to.have.all.members
似乎有效。我只能找到关于
.keys
的此功能的提及,但看起来它也适用于带有数组的
.members


4
投票

你可以用 2 行来完成:

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

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


2
投票

从未来开始,对我有用的方法是使用 .deepEqual 这对我有用

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

2
投票

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

具体来说:

have.members
have.deep.members

取决于您的需求。

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


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.