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

Jest无法Mock配置值:修改val2未生效的问题求助

问题原因及解决方案

问题原因

  • 解构赋值提前固化值:function.js中const { val2 } = envs;在模块加载时就已执行,此时val2被固定为500(环境变量未设置的默认值),后续修改envs.val2不会影响这个已解构出的独立变量。
  • Jest Mock顺序错误:测试文件先导入function.js和config.js,再调用jest.mock('./config.js'),此时function.js已加载原始config.js模块,Mock无法生效。
  • Mock对象不共享:测试文件中修改的envs是自身导入的实例,function.js内部导入的envs是另一个独立实例,两者属性修改互不影响。

解决方案

方法1:修改function.js延迟获取值

将解构操作移到函数内部,确保每次调用都读取最新的envs.val2:

// function.js
import { envs } from './config.js'

export async function doSomethingWithVal2() {
  const { val2 } = envs; // 移至函数内部
  console.log(val2); // 可获取修改后的值
  // ...其他逻辑
}

方法2:正确Mockconfig.js导出

调整导入顺序,先Mock模块再导入依赖,直接指定Mock值:

// function.test.js
// 先Mock config.js,再导入其他模块
jest.mock('./config.js', () => ({
  envs: {
    val2: 2, // 设置Mock的val2值
    // 根据测试需求添加其他必要属性
  }
}));

import { doSomethingWithVal2 } from './function.js'

describe('tests', () => {
  beforeEach(() => {
    jest.resetModules();
    jest.clearAllMocks();
  });

  it('performs some func', async () => {
    await doSomethingWithVal2(); // 此时会打印2
  });
});

方法3:动态调整Mock值

若需在不同用例中设置不同val2,可通过getter返回可修改对象:

// function.test.js
const mockEnvs = { val2: 500 };
jest.mock('./config.js', () => ({
  get envs() {
    return mockEnvs; // 用getter返回可修改对象
  }
}));

import { doSomethingWithVal2 } from './function.js'

describe('tests', () => {
  beforeEach(() => {
    jest.resetModules();
    jest.clearAllMocks();
    mockEnvs.val2 = 500; // 重置初始值
  });

  it('uses val2=2', async () => {
    mockEnvs.val2 = 2;
    await doSomethingWithVal2(); // 打印2
  });

  it('uses default val2=500', async () => {
    await doSomethingWithVal2(); // 打印500
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:13:28