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

Jest中mock导入的工具函数不生效,如何让today全局返回固定日期

问题根因
  • jest.mock存在自动提升机制,会被Jest优先提到文件最顶部、早于所有import语句执行,写在it用例内部的jest.mock不会按照预期时机执行,mock本身无效
  • 你在mock执行前就已经提前导入了today和依赖它的myFunction,两者拿到的都是原始未mock的模块引用,后续再执行mock也无法替换已经导入的内容
解决方案

方案1:顶层声明mock(推荐,适合全文件统一mock规则)

将jest.mock移到文件顶层,Jest会自动提升它到所有导入语句之前执行,后续导入的所有依赖都会拿到mock后的模块:

// jest.mock 写在所有import之前
jest.mock('utils/date', () => ({
  ...jest.requireActual('utils/date'),
  today: jest.fn(() => '01-01-2020'),
}));

import { today } from "utils/date";
import myFunction from "helpers/myFunction";

it('should work properly', () => {
  console.log(today()); // 输出 01-01-2020
  expect(myFunction()).toEqual('01-01-2020');

  // 如果需要修改当前用例的返回值,直接修改mock实例即可,所有引用处都会同步生效
  // today.mockReturnValue('02-02-2020')
});

方案2:动态导入配合jest.doMock(适合单用例单独mock的场景)

如果你只需要在单个用例里mock这个模块,可以用jest.doMock配合require动态导入依赖,避免提升影响其他用例:

it('should work properly', () => {
  jest.doMock('utils/date', () => ({
    ...jest.requireActual('utils/date'),
    today: jest.fn(() => '01-01-2020'),
  }));
  // 动态导入依赖,确保拿到mock后的模块实例
  const { today } = require('utils/date');
  const myFunction = require('helpers/myFunction').default;

  console.log(today()); // 输出 01-01-2020
  expect(myFunction()).toEqual('01-01-2020');
});

注意:jest.doMock不会被自动提升,必须写在动态导入语句之前才会生效

内容的提问来源于stack exchange,提问作者underfrankenwood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:57:03