Jest测试中对比两个JS对象时如何忽略深层嵌套的uuid属性
Jest 忽略嵌套uuid属性的对象相等对比方案
以下三种方案可根据你的使用场景选择:
方案1:递归清理uuid后直接对比
通用度最高,不限制对象结构,先移除所有层级的uuid属性后再做全等对比:
// 递归移除对象所有层级的uuid属性 const removeUUIDs = (obj) => { if (Array.isArray(obj)) { return obj.map(item => removeUUIDs(item)); } if (obj !== null && typeof obj === 'object') { const newObj = {}; for (const key in obj) { if (key !== 'uuid') { newObj[key] = removeUUIDs(obj[key]); } } return newObj; } return obj; }; // 测试用例 test('两个对象除uuid外完全相等', () => { const object1 = { uuid: '5435443', name: 'xxx', branches: [{ uuid: '643643', children: [{ uuid: '65654' }] }] }; const object2 = { uuid: '7657657', name: 'xxx', branches: [{ uuid: '443444', children: [{ uuid: '09809' }] }] }; expect(removeUUIDs(object1)).toEqual(removeUUIDs(object2)); });
方案2:使用Jest不对称匹配器
适合明确知道对象结构的场景,不需要额外编写工具函数,直接用Jest自带的匹配器规则实现:
test('两个对象除uuid外完全相等', () => { const object1 = { uuid: '5435443', name: 'xxx', branches: [{ uuid: '643643', children: [{ uuid: '65654' }] }] }; const object2 = { uuid: '7657657', name: 'xxx', branches: [{ uuid: '443444', children: [{ uuid: '09809' }] }] }; // 匹配规则中不需要声明uuid字段,Jest会自动忽略未声明的字段做匹配 const matchRule = expect.objectContaining({ name: 'xxx', branches: expect.arrayContaining([ expect.objectContaining({ children: expect.arrayContaining([ expect.objectContaining({}) ]) }) ]) }); expect(object1).toEqual(matchRule); expect(object2).toEqual(matchRule); });
方案3:自定义Jest匹配器复用逻辑
如果项目中频繁需要做忽略uuid的对比,可以封装为全局自定义匹配器,减少重复代码:
// 可放在jest.setup.js中全局注册,复用方案1的removeUUIDs工具函数 expect.extend({ toEqualExceptUUID(received, expected) { const cleanReceived = removeUUIDs(received); const cleanExpected = removeUUIDs(expected); const pass = this.equals(cleanReceived, cleanExpected); if (pass) { return { message: () => `预期两个对象除uuid外不相等,但实际相等`, pass: true }; } else { return { message: () => `预期两个对象除uuid外相等,差异如下:\n${this.utils.diff(cleanReceived, cleanExpected)}`, pass: false }; } } }); // 测试用例中直接调用 test('两个对象除uuid外完全相等', () => { const object1 = { uuid: '5435443', name: 'xxx', branches: [{ uuid: '643643', children: [{ uuid: '65654' }] }] }; const object2 = { uuid: '7657657', name: 'xxx', branches: [{ uuid: '443444', children: [{ uuid: '09809' }] }] }; expect(object1).toEqualExceptUUID(object2); });
内容的提问来源于stack exchange,提问作者fullstack
相关产品推荐
相关产品推荐

