如何断言两个对象深度相等且允许指定字段为数字或null
原有方案的问题
- 你现在用的
delete删除属性的写法会直接修改原始的obj1和obj2对象,如果后续代码还需要用到这两个对象的c字段,会出现隐性bug,非常不推荐。 - 原有代码里用的
within方法是用来校验数字区间的,枚举值校验应该用oneOf方法。
更合理的实现方案
方案1:Chai 4.4.0+ 版本一行实现(无副作用)
高版本Chai支持断言占位符,直接在深度相等的结构里指定c字段的取值规则,全程不会修改原对象:
expect(obj1).to.deep.equal({ ...obj2, c: expect.to.be.oneOf([3, null]) })
方案2:低版本Chai兼容写法
如果用的是旧版本Chai不支持占位符,可以用ES6解构赋值提取剩余字段对比,同样不会修改原对象:
// 单独校验c字段符合取值要求 expect(obj1.c).to.be.oneOf([3, null]) // 解构提取除c外的其余字段做深度相等校验 const { c: _, ...restObj1 } = obj1 const { c: __, ...restObj2 } = obj2 expect(restObj1).to.deep.equal(restObj2)
内容的提问来源于stack exchange,提问作者Sujeet
相关产品推荐
相关产品推荐

