You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jest中忽略顺序比较集合、验证数组?附Chai等价语法

在Jest中忽略顺序比较集合/验证数组恰好包含任意顺序的预期值

嘿,很高兴帮你解答这个Jest的测试问题!你提到在Chai里用expect(value).to.have.members([2, 1, 3])来验证数组包含任意顺序的预期元素,在Jest里有几种等价的实现方式,我给你整理一下:

方法1:排序后直接比较(最简单直观)

如果你的数组元素是可排序的(比如数字、字符串),可以先对两个数组排序,再用toEqual严格匹配。这种方式不需要额外配置,适合大多数场景:

const value = [1, 2, 3];
// 对原数组和预期数组分别排序后比较
expect(value.sort()).toEqual([2, 1, 3].sort());

方法2:结合arrayContaining和长度校验(更严谨的子集+长度匹配)

Jest的expect.arrayContaining会验证目标数组包含所有预期元素,但不会检查是否有额外元素。如果要确保恰好包含这些元素(没有多余也没有缺失),可以搭配toHaveLength校验数组长度:

const value = [1, 2, 3];
const expected = [2, 1, 3];

// 验证所有预期元素都存在
expect(value).toEqual(expect.arrayContaining(expected));
// 验证数组长度一致,确保没有额外元素
expect(value).toHaveLength(expected.length);

方法3:自定义匹配器(复用性更高)

如果你的项目中经常需要这种“忽略顺序的全量匹配”,可以自定义一个Jest匹配器,让写法和Chai更接近:

// 在测试文件顶部或者jest.setup.js中注册自定义匹配器
expect.extend({
  toHaveSameMembers(received, expected) {
    // 先复制数组避免修改原数据,再排序
    const sortedReceived = [...received].sort();
    const sortedExpected = [...expected].sort();
    
    const pass = expect(sortedReceived).toEqual(sortedExpected);
    return {
      pass: pass,
      message: () => `expected [${received}] to have the same members as [${expected}]`
    };
  }
});

// 使用自定义匹配器
const value = [1, 2, 3];
expect(value).toHaveSameMembers([2, 1, 3]);

以上几种方式都能实现你要的“忽略元素顺序,验证数组恰好包含预期值”的需求,你可以根据项目场景选择最合适的一种~

内容的提问来源于stack exchange,提问作者Daniel Wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:39:41