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

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);
  });
});

问题原因

  1. jest.mock是静态声明,会在测试文件执行的初始预处理阶段就被Jest处理,测试用例内部的jest.mock不会生效。
  2. 测试文件顶部提前导入了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:45:05