Jest中如何为特定测试用例模拟常量变量?
如何为Jest的特定测试用例模拟常量变量
我尝试在Jest测试中为不同测试用例模拟不同值的常量变量,但第二个测试始终使用第一个模拟的值,无法应用本地模拟。相关代码如下:
代码示例
env.ts
export const VAR1: number = 1; export const VAR2: number = 2;
function.ts
import { VAR1, VAR2 } from "./env"; export function sum(): number { return VAR1 + VAR2; }
原测试代码(function.spec.ts)
import { sum } from "../src/function"; jest.mock("../src/env", () => ({ VAR1: 10, VAR2: 20, })); describe("module", () => { beforeEach(() => { jest.resetModules(); }); test("THIS TEST WORKS FINE", () => { expect(sum()).toBe(30); }); test("THIS TEST DOESN'T WORK, sum() IS RETURNING 30", () => { jest.mock("../src/env", () => ({ VAR1: 100, VAR2: 200, })); expect(sum()).toBe(300); }); });
问题原因
jest.mock是静态声明,会在测试文件执行的初始预处理阶段就被Jest处理,测试用例内部的jest.mock不会生效。- 测试文件顶部提前导入了
sum模块,此时sum已经依赖第一次模拟的env常量,后续即使调用jest.resetModules,也不会重新加载已导入的sum。
解决方案
要为不同测试用例单独模拟常量,需要动态导入模块并使用jest.doMock(动态版本的mock,在运行时执行)。修改后的测试代码如下:
修改后的function.spec.ts
describe("module", () => { beforeEach(() => { jest.resetModules(); // 清空模块缓存,确保每次测试都重新加载模块 }); test("THIS TEST WORKS FINE", async () => { jest.doMock("../src/env", () => ({ VAR1: 10, VAR2: 20, })); // 动态导入sum模块 const { sum } = await import("../src/function"); expect(sum()).toBe(30); }); test("THIS TEST WORKS NOW", async () => { jest.doMock("../src/env", () => ({ VAR1: 100, VAR2: 200, })); // 动态导入sum模块 const { sum } = await import("../src/function"); expect(sum()).toBe(300); }); });
补充说明
jest.doMock不会被Jest预处理,而是在测试用例运行时执行,能覆盖之前的mock配置。- 每次测试都动态导入
sum,结合beforeEach里的jest.resetModules(),确保每次加载的sum都使用当前测试用例的mock常量。
内容的提问来源于stack exchange,提问作者Elmer
相关产品推荐
相关产品推荐

