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

如何使用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文件统一管理:

  1. 在项目根目录新建__mocks__/module1.js文件,写入Mock逻辑:
const mockDoSomething = jest.fn().mockResolvedValue('默认返回结果')
export const testObject = {
  doSomething: mockDoSomething
}
  1. 后续任意测试文件中只要调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:54:03