You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:27:04