如何用Jest仅模拟模块中单个类并保留其原有结构?
如何在Jest中仅模拟模块的单个类并自动保留其结构?
可以利用Jest的jest.createMockFromModule方法实现需求,它能像自动模拟整个模块那样,为单个类生成保留原有结构的mock,同时保留其他类的真实实现。
解决方案代码
jest.mock('myModule', () => { // 获取模块的真实实现 const actualModule = jest.requireActual('myModule'); // 自动生成MyClass1的mock,完整保留类的方法结构 const mockedMyClass1 = jest.createMockFromModule('myModule').MyClass1; return { ...actualModule, MyClass1: mockedMyClass1, }; });
原理说明
jest.createMockFromModule会分析目标模块的结构,自动为类生成对应的mock:构造函数是mock函数,类的原型方法也会被替换为jest mock函数,实例化后会保留原类的方法结构,完全等同于直接调用jest.mock('myModule')时生成的mock效果。- 通过
jest.requireActual获取模块的真实实现,再替换掉需要mock的类,就能保证其他类(比如MyClass2)使用原有逻辑。
测试验证示例
const { MyClass1, MyClass2 } = require('myModule'); test('MyClass1的方法自动被mock', () => { const myClass1Instance = new MyClass1(); // 验证实例方法是mock函数 expect(jest.isMockFunction(myClass1Instance.filter)).toBe(true); // 调用mock方法并验证调用 myClass1Instance.filter('test'); expect(myClass1Instance.filter).toHaveBeenCalledWith('test'); }); test('MyClass2保留真实实现', () => { const myClass2Instance = new MyClass2(); // 此处可验证MyClass2的真实业务逻辑 });
为什么之前的写法无效
直接用jest.fn()替换MyClass1时,只会把构造函数变成mock,但不会自动生成类原型上的方法,导致实例是空的mock对象。而jest.createMockFromModule会完整模拟类的原型链和所有方法,无需手动定义每个方法的mock实现。
内容的提问来源于stack exchange,提问作者PierBJX
相关产品推荐
相关产品推荐

