比较 chai 中的数组

Posted

技术标签:

【中文标题】比较 chai 中的数组【英文标题】:Comparing arrays in chai 【发布时间】:2016-02-17 18:24:21 【问题描述】:

我正在使用 chai 和 chai-as-promised(以及更多框架,但在这种情况下无关紧要)编写一些测试,我需要检查从网页获得的数组是否与预定义的数组。我尝试使用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,2,3,4][1,2,3]

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

【问题讨论】:

【参考方案1】:

看到这被标记为之前已解决,我尝试做与接受的答案相同的事情。它可能在当时有效,但似乎不再有效:

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 ]

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

【讨论】:

如果此拉取请求在 13 年合并,为什么它在 16 年 8 月有效? 不。但是如果我们深入挖掘提交,那么也许他们让它不起作用,因为从那时到现在之间的某个时间,它从来没有被认为是应该的。 :-) 如果您曾经测试过对象数组,这可能会通过您的解决方案:expect(result).to.have.same.deep.members(expected); 如果订单相关,您可以使用to.have.ordered.members【参考方案2】:

你可以用 2 行来完成:

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

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

【讨论】:

我不确定它是否有效,因为listFromPage 是承诺数组,predefinedArray 是值数组。我可以比较数组的长度,但我想知道是否有单行解决方案。 有一个使用“有”的单行解决方案,如另一个答案中所述。【参考方案3】:

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

【讨论】:

你的意思是expect([1,2,3,4]).to.have.all.members([1,2,3])会失败吗?因为在这种情况下我需要它失败,这是使用to.have.all.members的主要问题 是的,完全正确:expect([1, 2, 3, 4]).to.have.all.members([2, 3, 1, 4]) 成功,但 expect([1, 2, 3, 4]).to.have.all.members([1, 2, 3]) 失败并显示 AssertionError: expected [ 1, 2, 3, 4 ] to have the same members as [ 1, 2, 3 ] 这可能在您编写它时有效,但此后停止工作。有关当前工作示例,请参阅my answer。 :-)【参考方案4】:

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

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

【讨论】:

OP 正在寻找一种不依赖于顺序的方式来实现它,深度相等似乎期望顺序相同:(【参考方案5】:

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

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

取决于您的需求。

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

【讨论】:

以上是关于比较 chai 中的数组的主要内容,如果未能解决你的问题,请参考以下文章

量角器JS chai - 我如何使用getText()断言数组中的元素文本包含字符串?

chai.js中文文档

chai 测试:包含对象类型的数组

比较 ClickHouse 行中的两个数组

比较和替换数组中的值

如何比较数组中的 UIImages?