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
相关产品推荐
相关产品推荐

