如何在Jest中模拟已导入类的内部依赖(非模拟导入类本身)
解决方法
你当前报错的核心原因是jest.mock的目标错误:你误mock了需要保留原实现的被测类,却没有mock你想要替换的内部依赖。
正确的测试实现如下:
// ClassIAmTesting.test.js // 第一步:mock你要替换的依赖模块,而非被测类 jest.mock('./DependencyIWantToMock.js') // 导入依赖(此时已经被jest替换为mock构造函数) import DependencyIWantToMock from './DependencyIWantToMock.js' // 导入被测类,不要对它执行jest.mock,保留原实现 import ClassIAmTesting from './ClassIAmTesting.js' // 可选:每次用例执行前清空mock调用记录,避免用例间互相影响 beforeEach(() => { DependencyIWantToMock.mockClear() }) test('run方法会正确调用依赖的run逻辑', async () => { // 定义模拟的run方法,根据需要可以修改返回值 const mockRunFn = jest.fn().mockResolvedValue(/* 自定义返回值 */) // 自定义mock构造函数的返回值,给实例挂载模拟的run方法 DependencyIWantToMock.mockImplementation(() => ({ run: mockRunFn })) const testInstance = new ClassIAmTesting() await testInstance.run() // 可选:添加断言验证逻辑正确性 expect(DependencyIWantToMock).toHaveBeenCalledTimes(1) // 验证依赖被正确实例化 expect(mockRunFn).toHaveBeenCalledTimes(1) // 验证依赖的run方法被调用 })
实现原理
jest.mock(依赖模块路径)会将该模块的导出内容自动替换为Jest的mock构造函数,当被测类内部执行new DependencyIWantToMock()时,实际创建的是Jest生成的mock实例- 通过
mockImplementation自定义mock构造函数的返回值,就能手动指定实例上的run方法实现,完全替换原依赖的逻辑
注意事项
- 不要对被测类
ClassIAmTesting执行jest.mock,否则它的原实现会被替换为空mock函数,无法测试原有逻辑 - 如果需要模拟
run方法抛出错误的场景,把mockResolvedValue替换为mockRejectedValue(错误对象)即可 - 如果依赖有多个实例方法,在
mockImplementation返回的对象里逐一添加对应的mock函数即可
内容的提问来源于stack exchange,提问作者Antonio Gamiz Delgado
相关产品推荐
相关产品推荐

