如何在Jest中测试类实例与对象的严格相等(无需逐个断言)?
解决思路与方案
方案1:将普通对象转换为DummyClass实例
如果必须让普通对象成为类的实例,有两种实用方式:
快速转换(无需修改类)
用Object.create创建一个带有DummyClass原型的空对象,再把普通对象的所有属性赋值进去:
const plainObj = { /* 你的海量数据对象 */ }; const instanceLikeObj = Object.assign(Object.create(DummyClass.prototype), plainObj);
这样instanceLikeObj的原型链和new DummyClass()生成的实例完全一致,用toStrictEqual断言就能顺利通过。
规范转换(修改类构造函数)
如果有权修改DummyClass的构造函数,可以让它支持从对象初始化属性,更符合类的设计逻辑:
class DummyClass { constructor(obj = {}) { // 将传入对象的属性全部挂载到实例上 Object.assign(this, obj); } } // 直接用普通对象生成合规实例 const convertedInstance = new DummyClass(plainObj);
方案2:跳过原型检查,仅对比属性
如果不需要转换对象,只是想让断言通过,解构实例得到普通对象是最省心的方法,完美适配数据量大的场景:
test('实例与普通对象属性完全一致', () => { const myInstance = new DummyClass(); const plainObj = { /* 你的大对象 */ }; // 解构实例得到普通对象,再和plainObj做严格属性对比 expect({ ...myInstance }).toStrictEqual(plainObj); });
解构操作会提取实例的所有自身可枚举属性到新的普通对象中,此时toStrictEqual只会对比属性内容,完全忽略原型差异。你也可以用Object.assign({}, myInstance)代替解构,效果完全相同。
内容的提问来源于stack exchange,提问作者s.khan
相关产品推荐
相关产品推荐

