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

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,这也会导致测试报错。

修正步骤如下:

  1. 修正mock路径,改为正确的相对路径
  2. 同步修改测试文件中trackEvent的导入路径
  3. 修正测试用例中的函数调用,使用实际导出的函数名

修正后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:24:56