Jest mock ES6类后构造函数调用监测未生效如何解决?
问题根因
- 导出导入方式不匹配
- 若
ClassA是ES6默认导出(export default ClassA),通过CommonJS的require直接导入时,拿到的是{ default: 构造函数 }的对象,而非构造函数本身 - 若
ClassA是ES6命名导出(export class ClassA {}),通过CommonJS的require直接导入时,拿到的是{ ClassA: 构造函数 }的对象,需要解构才能拿到实际构造函数
你断言的ClassA不是实际被调用的构造函数,因此统计不到调用次数。
- 若
- 模块路径不匹配
若业务代码中导入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.
相关产品推荐
相关产品推荐

