如何使用Jest测试类构造函数的正确初始化逻辑?
测试构造函数初始化的正确姿势
嘿,这个问题我之前踩过坑!其实不用搞那些复杂的mock操作,直接测试实例的属性就够了——既不会破坏原构造函数的逻辑,又能精准验证每个属性是不是被正确赋值了,包括防止参数颠倒的情况。
直接上代码示例:
// 假设你的SomeClass在某个文件里,先导入它 const SomeClass = require('./path-to-your-class'); test('SomeClass构造函数正确初始化a和b属性', () => { // 用明确的、不容易混淆的测试值,避免和其他值搞混 const testValueA = '我是属性a的测试值'; const testValueB = 999; // 创建实例 const instance = new SomeClass(testValueA, testValueB); // 分别断言每个属性的取值 expect(instance.a).toBe(testValueA); expect(instance.b).toBe(testValueB); }); // 额外加一个测试,专门验证不会把a和b的赋值搞颠倒 test('SomeClass构造函数不会颠倒a和b的赋值', () => { const valueForA = '应该给a的值'; const valueForB = '应该给b的值'; const instance = new SomeClass(valueForA, valueForB); // 反向断言,确保a不是b的值,b不是a的值 expect(instance.a).not.toBe(valueForB); expect(instance.b).not.toBe(valueForA); });
为什么这个方法靠谱?
- 你提到的
toBeCalledWith只能验证构造函数被调用时传入的参数,但没法确认内部是不是把参数赋给了正确的属性——比如如果构造函数里写反了this.a = b; this.b = a;,toBeCalledWith根本查不出来。 - 而
mockImplementation会直接替换原构造函数的逻辑,相当于你测试的是自己写的mock代码,不是真实的构造函数实现,完全失去了测试的意义。
直接测试实例属性的方式,是在验证构造函数执行后的实际结果,这才是我们真正关心的:实例是不是按照预期被初始化了。
内容的提问来源于stack exchange,提问作者Le garcon
相关产品推荐
相关产品推荐

