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

Jest mock ES6类后构造函数调用监测未生效如何解决?

问题根因

  1. 导出导入方式不匹配
    • 若ClassA是ES6默认导出(export default ClassA),通过CommonJS的require直接导入时,拿到的是{ default: 构造函数 }的对象,而非构造函数本身
    • 若ClassA是ES6命名导出(export class ClassA {}),通过CommonJS的require直接导入时,拿到的是{ ClassA: 构造函数 }的对象,需要解构才能拿到实际构造函数
      你断言的ClassA不是实际被调用的构造函数,因此统计不到调用次数。
  2. 模块路径不匹配
    若业务代码中导入ClassA的路径和jest.mock中声明的路径不一致,会导致mock未命中,业务代码实际使用的还是原始类,自然统计不到mock构造函数的调用。

解决方案

方案1:修正导入写法

根据你的导出方式调整导入语句即可:

  • 默认导出场景:
const mockGetCheapestProductAllPages = jest.fn()
// 取default属性拿到实际的mock构造函数
const ClassA = require('../src/ClassA/ClassA').default
jest.mock('../src/ClassA/ClassA', () => {
  return jest.fn().mockImplementation(() => {
    return { getCheapestProductAllPages: mockGetCheapestProductAllPages }
  })
})
  • 命名导出场景:
const mockGetCheapestProductAllPages = jest.fn()
// 解构拿到实际的mock构造函数
const { ClassA } = require('../src/ClassA/ClassA')
jest.mock('../src/ClassA/ClassA', () => {
  return {
    ClassA: jest.fn().mockImplementation(() => {
      return { getCheapestProductAllPages: mockGetCheapestProductAllPages }
    })
  }
})

调整后执行expect(ClassA).toHaveBeenCalled()即可正常统计构造函数调用次数。

方案2:使用ES6 import语法

如果你的项目支持ES模块导入,换成import写法可自动适配导出规则,避免匹配问题:

import ClassA from '../src/ClassA/ClassA'

const mockGetCheapestProductAllPages = jest.fn()
jest.mock('../src/ClassA/ClassA', () => {
  return jest.fn().mockImplementation(() => {
    return { getCheapestProductAllPages: mockGetCheapestProductAllPages }
  })
})

方案3:兜底校验写法

如果不确定导出方式,可以直接兼容两种场景做断言:

expect(ClassA.default ?? ClassA).toHaveBeenCalled()

内容的提问来源于stack exchange,提问作者J. K.

相关产品推荐
方舟 Agent Plan

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

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