如何在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
相关产品推荐
相关产品推荐

