Chai中如何验证对象数组的属性值与另一数组的元素完全匹配
Chai 验证对象数组指定属性匹配目标数组解决方案
原代码失败原因
你使用的deep.members断言会严格对比两个数组的元素结构,array1的元素是对象、array2的元素是字符串,类型完全不匹配,所以必然断言失败。
方案1:原生Chai无插件实现
不需要额外引入插件,通过satisfy断言封装匹配逻辑,不需要修改测试目标的原始结构:
test('Array includes ids', function() { const array1 = [ { type: 'type1', id: '1' }, { type: 'type2', id: '2' } ] const array2 = ['1', '2'] // 同时验证:id全部匹配、数量完全一致没有多余/缺失 chai.expect(array1).to.satisfy(arr => { return arr.every(item => array2.includes(item.id)) && arr.length === array2.length }) })
方案2:语义化断言实现(使用chai-things插件)
如果追求更符合Chai声明式风格的写法,可以引入轻量插件chai-things,代码更易读:
- 安装依赖:
npm install chai-things --save-dev - 代码示例:
const chai = require('chai') chai.use(require('chai-things')) test('Array includes ids', function() { const array1 = [ { type: 'type1', id: '1' }, { type: 'type2', id: '2' } ] const array2 = ['1', '2'] // 验证所有元素的id都属于array2 chai.expect(array1).all.to.have.property('id').that.is.oneOf(array2) // 补充验证数量完全匹配(如果需要严格一一对应无遗漏) chai.expect(array1).to.have.lengthOf(array2.length) })
内容的提问来源于stack exchange,提问作者conciliator
相关产品推荐
相关产品推荐

