Jest模拟导入函数失败:始终调用原函数如何解决?
问题:Jest无法Mock trackEvent函数,始终执行真实实现
我在segmentEvents.ts模块中有一个函数,希望断言调用该函数时,另一个函数trackEvent会被触发。但目前无法mock trackEvent以验证其调用情况,无论采取何种操作,都会执行该函数的真实实现。请问我哪里操作有误?该如何正确mock trackEvent?
以下是我的代码,所有文件位于同一目录:
test.spec.ts
jest.mock('./segment', () => ({ trackEvent: jest.fn(), })); import { expect } from '@jest/globals'; import eventHandlers from './segmentEvents'; import { trackEvent } from './segment'; describe('Segment Events', () => { beforeEach(() => { jest.clearAllMocks(); }); it('should call trackEvent when someEvent is invoked', () => { console.log('trackEvent', trackEvent); // 本应是mock函数,但实际不是 eventHandlers.someEvent(); expect(trackEvent).toHaveBeenCalled(); }); });
segmentEvents.ts
import { trackEvent } from "./segment"; function mealPlanSelected(): void { trackEvent(); } const eventHandlers = { mealPlanSelected, }; export default eventHandlers;
src/utils/segment.ts
export const trackEvent = (): String => { console.log("***Event Tracked***"); return 'test'; }
解决方案
你的问题核心是文件路径不匹配,导致Jest没能正确mock目标模块:
- 测试文件里mock的是
./segment,但实际trackEvent函数位于src/utils/segment.ts,路径错误导致mock失效,Jest只能加载真实的函数实现。 - 测试用例里调用的
eventHandlers.someEvent()在segmentEvents.ts中不存在,实际导出的是mealPlanSelected,这也会导致测试报错。
修正步骤如下:
- 修正mock路径,改为正确的相对路径
- 同步修改测试文件中
trackEvent的导入路径 - 修正测试用例中的函数调用,使用实际导出的函数名
修正后的test.spec.ts
jest.mock('./src/utils/segment', () => ({ trackEvent: jest.fn(), })); import { expect } from '@jest/globals'; import eventHandlers from './segmentEvents'; import { trackEvent } from './src/utils/segment'; describe('Segment Events', () => { beforeEach(() => { jest.clearAllMocks(); }); it('should call trackEvent when mealPlanSelected is invoked', () => { console.log('trackEvent', trackEvent); // 现在会输出mock函数 eventHandlers.mealPlanSelected(); expect(trackEvent).toHaveBeenCalled(); }); });
修改后,Jest就能正确mocktrackEvent函数,你可以正常验证它的调用情况,同时不会再执行真实函数中的console.log输出。
内容的提问来源于stack exchange,提问作者user1168320
相关产品推荐
相关产品推荐

