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

