如何使用Jest mock第三方模块内部导出实例时执行的类构造函数
实现方案
主流单元测试框架(Jest、Vitest)都支持模块级Mock能力,可以直接拦截第三方模块的导出逻辑,完全不执行原模块的new Test()代码,避免构造函数入参报错。
方案1:单测试文件临时Mock
在测试文件最顶部添加Mock逻辑,注意jest.mock(Vitest对应vi.mock)要写在所有业务代码导入语句之前:
// 测试文件开头 jest.mock('module1', () => { // 完全自定义mock的导出对象 const mockDoSomething = jest.fn().mockResolvedValue('自定义返回结果') return { testObject: { doSomething: mockDoSomething } } }) // 后续导入的testObject已经是mock后的对象 import { foo } from '你的业务模块路径' import { testObject } from 'module1' describe('test', () => { test('验证foo正确调用doSomething', () => { foo() // 可选添加调用断言 expect(testObject.doSomething).toHaveBeenCalled() }) })
该方案会完全替换原module1的实现,原模块顶层的new Test()代码不会执行,不会触发构造函数的入参依赖报错。
方案2:全局复用Mock
如果多个测试文件都需要Mockmodule1,可以创建全局Mock文件统一管理:
- 在项目根目录新建
__mocks__/module1.js文件,写入Mock逻辑:
const mockDoSomething = jest.fn().mockResolvedValue('默认返回结果') export const testObject = { doSomething: mockDoSomething }
- 后续任意测试文件中只要调用
jest.mock('module1'),就会自动使用上述全局Mock实现,无需重复编写Mock代码。
ESM场景适配
如果你的项目使用ESModule规范,Jest需要额外开启experimental-vm-modules Node参数适配;也可以直接使用Vitest,对ESM的原生支持更友好,Mock语法和Jest完全兼容,只需把jest.fn替换为vi.fn、jest.mock替换为vi.mock即可使用。
内容的提问来源于stack exchange,提问作者blackFlagBaby
相关产品推荐
相关产品推荐

