【问题标题】:How do I compare two collections in Jest ignoring element order?如何在 Jest 中忽略元素顺序比较两个集合?
【发布时间】:2018-10-13 14:16:19
【问题描述】:

在 Jest 中编写单元测试时,如何测试一个数组是否完全包含预期值以任何顺序

在 Chai 中,我可以写:

const value = [1, 2, 3];
expect(value).to.have.members([2, 1, 3]);

Jest 中的等效语法是什么?

【问题讨论】:

标签: javascript unit-testing jestjs


【解决方案1】:

另一种方法是使用来自jest-community/jest-extended 的自定义匹配器.toIncludeSameMembers()

自述文件中给出的示例

test('passes when arrays match in a different order', () => {
    expect([1, 2, 3]).toIncludeSameMembers([3, 1, 2]);
    expect([{ foo: 'bar' }, { baz: 'qux' }]).toIncludeSameMembers([{ baz: 'qux' }, { foo: 'bar' }]);
});

仅为一个匹配器导入库可能没有意义,但他们有很多其他有用的匹配器,我发现它们很有用。

补充说明,如果您使用的是 Typescript,则 should import 使用此行添加到 expect 的方法的类型:

import 'jest-extended';

【讨论】:

    【解决方案2】:

    我可能只是检查排序时数组是否相等:

    expect(value.sort()).toEqual([2, 1, 3].sort())
    

    【讨论】:

      【解决方案3】:

      也许您可以使用array.sort 方法和arrayContaining 方法一起排列订单。您可能还包括一个长度测试以获得良好的衡量标准。

      const value = [1, 2, 3];
      expect(value).toHaveLength(3);
      expect(value.sort()).toEqual(expect.arrayContaining(value.sort()));
      

      【讨论】:

      • 您的第二个期望测试该值包含其自己的项目。如果您正在对列表进行排序,那么您肯定不需要同时使用arrayContaining
      【解决方案4】:

      arrayContaining

      expect(value).toEqual(expect.arrayContaining([2, 1, 3]));
      

      【讨论】:

      • arrayContaining 与我需要的类似。但是,arrayContaining 允许actual 具有不在expected 中的附加值。我想确保两个数组都包含完全相同的元素,只是顺序可能不同。
      • 那你自己写吧。
      猜你喜欢
      • 2023-03-21
      • 2013-05-08
      • 2018-08-16
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多