如何用Chai Subset或替代插件测试含未知数组的复杂JSON
用 Chai Subset 验证 JSON 中的数组字段
当然可以用 Chai Subset 实现你的需求!而且完全能同时满足「验证 examples 是数组」和「断言数组至少有1个元素」这两个要求,下面给你具体的实现方式:
基础需求:仅验证 examples 是数组
如果你只需要确认 examples 是数组类型,不管里面元素是什么(哪怕是空数组也接受),可以这么写:
const chai = require('chai'); const chaiSubset = require('chai-subset'); chai.use(chaiSubset); const expect = chai.expect; // 假设你的待测试JSON对象是testObj const testObj = { // 其他字段... examples: [/* 任意元素,甚至空数组 */] }; expect(testObj).to.containSubset({ examples: expect.it.to.be.an('array') });
这里利用了 Chai Subset 支持在子集断言中嵌套 Chai 原生断言的特性,直接指定 examples 必须是数组类型,完全不关心数组内部的元素结构。
进阶需求:验证数组且至少含1个元素
如果要额外确保数组不为空,只需要在嵌套断言里加上长度校验即可:
expect(testObj).to.containSubset({ examples: expect.it.to.be.an('array').and.to.have.lengthOf.at.least(1) });
这样既验证了 examples 的数组类型,又保证了它至少包含一个元素,完美匹配你的进阶需求。
替代方案:不用 Chai Subset 也能实现
如果你不想额外引入 Chai Subset 插件,直接用 Chai 的原生断言也能达到同样效果,写法更直白:
// 先验证字段类型 expect(testObj.examples).to.be.an('array'); // 再验证数组非空(可选) expect(testObj.examples).to.not.be.empty; // 或者用长度校验的写法 expect(testObj.examples.length).to.be.greaterThan(0);
这种方式不需要额外依赖,适合不想增加插件的场景,而且可读性也很强。
总结一下:Chai Subset 完全能覆盖你的需求,而且支持在子集断言里组合多种校验规则;如果追求轻量,原生 Chai 断言也足够好用,你可以根据自己的项目情况选择。
内容的提问来源于stack exchange,提问作者ChrisJ
相关产品推荐
相关产品推荐

