比较 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)
解决此问题的方法,但我想知道是否有更好的解决方案。
在我的解决方法中最困扰我的是,我只保证predefinedArray
是listFromPage
的子集,而不是它们由相同的元素组成。
所以,我想知道是否有一个断言可以通过 [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.members
和
have.deep.members
取决于您的需求。
https://www.chaijs.com/api/bdd/#method_members
【讨论】:
以上是关于比较 chai 中的数组的主要内容,如果未能解决你的问题,请参考以下文章