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

为何chai.js中数组对象的include检查未按预期生效?

解决Chai断言数组包含对象失败的问题

嘿,我之前也踩过这个坑!你遇到的问题本质是Chai的include方法在处理对象和数组时的行为逻辑不一样:

  • 当你断言对象包含某个子对象时(比如官网的expect({a:1,b:2,c:3}).to.include({a:1,b:2})),Chai是做浅键值对比——只要目标对象有对应的键和值,不管是不是同一个引用都会通过。
  • 但当你断言数组包含某个对象时,include默认用**严格相等(===)**来判断元素是否存在。而两个字面量对象{a:1}是完全不同的引用,哪怕键值完全一样,===也会返回false,所以断言就失败了。

几种可行的解决方案

1. 使用deep.include进行深度对比

这是最直接的方式,给include加上deep修饰符,让Chai对数组元素做深度对比而不是引用对比:

expect([{a: 1}]).to.be.an('array').and.deep.include({a: 1});

2. 使用include.deep.members(适合多元素场景)

如果你需要验证数组包含多个指定对象,这种方式更清晰:

// 验证数组包含{a:1}和{b:2},顺序不影响
expect([{b:2}, {a:1}]).to.be.an('array').and.include.deep.members([{a:1}, {b:2}]);

3. 结合数组some方法和深度断言

如果需要更灵活的判断逻辑,可以用数组的some方法配合Chai的deep.equal:

expect([{a:1}].some(item => expect(item).to.deep.equal({a:1}))).to.be.true;

试试上面的方法,你的断言应该就能正常通过啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:36:52