【问题标题】:Comparing arrays in chai比较 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]

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

【问题讨论】:

    标签: arrays node.js chai


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 2020-02-26
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2010-10-17
      • 2016-05-13
      相关资源
      最近更新 更多