如何在Jest中临时将全局变量IS_TEST_ENV和_DEV_设为false以覆盖全分支
问题背景
先看相关代码:
// target.js const urlPrefix = IS_TEST_ENV || _DEV_ ? 'https://xxx/cms/media/' : 'https://zzz/cms/media/'; const formatImageSizeUrl = (url, size) => { if (!/\d+x\d+/.test(size)) { return url; } if (url.startsWith(urlPrefix)) { return `${url}?d=${size}`; } return url; }; ...
// jest.config.js module.exports = { globals: { IS_TEST_ENV: true, _DEV_: true } }
现在jest.config.js里把IS_TEST_ENV和_DEV_都设成了true,要临时改成false以覆盖formatImageSizeUrl的所有代码分支,有几种可行办法:
1. 单个测试文件内临时修改全局变量
在对应的测试文件中,通过beforeAll修改全局变量,同时重置模块保证新变量生效:
// 测试前修改全局变量 beforeAll(() => { global.IS_TEST_ENV = false; global._DEV_ = false; // 重置模块缓存,避免旧变量值的影响 jest.resetModules(); }); test('验证生产环境下的URL处理逻辑', () => { // 重新引入target模块,此时会用新的全局变量计算urlPrefix const { formatImageSizeUrl } = require('./target.js'); // 编写测试逻辑,比如验证生产环境前缀的URL是否正确拼接参数 }); // 可选:测试完成后恢复原变量,防止影响其他测试用例 afterAll(() => { global.IS_TEST_ENV = true; global._DEV_ = true; });
2. 命令行直接指定全局变量
不想改动代码的话,运行测试时通过--globals参数直接覆盖配置:
jest --globals='{"IS_TEST_ENV": false, "_DEV_": false}'
这种方式会让本次运行的所有测试都使用这两个变量的新值。
3. 创建单独的测试配置文件
如果需要频繁切换环境测试,可以新建一个jest.prod.config.js:
module.exports = { ...require('./jest.config.js'), // 继承原有配置 globals: { IS_TEST_ENV: false, _DEV_: false } }
运行测试时指定这个配置文件即可:
jest --config jest.prod.config.js
内容的提问来源于stack exchange,提问作者M.Joe
相关产品推荐
相关产品推荐

