如何在Jest中测试通过webpack.DefinePlugin定义的全局变量?
问题原因
webpack.DefinePlugin 是在打包构建阶段做字符串替换注入变量,Jest 运行测试时不经过 webpack 构建流程,所以运行环境中不存在全局的 foo 变量,需要单独为 Jest 配置全局变量。
解决方法
- 方案1:Jest 配置文件全局注入固定值
在jest.config.js或jest.config.ts中通过globals字段直接声明全局变量:
module.exports = { // 保留其他原有配置 globals: { foo: { env: { NAME: "loc", VERSION: "1.0.0" // 测试用固定值 } } } }
- 方案2:通过 setup 文件动态注入(适合需要动态生成值的场景)
首先在 Jest 配置中指定初始化文件:
module.exports = { // 保留其他原有配置 setupFilesAfterEnv: ['<rootDir>/jest.setup.js'] }
在项目根目录新建 jest.setup.js,将 foo 挂载到 Node 全局对象上:
global.foo = { env: { NAME: "loc", VERSION: require('./package.json').version // 可直接读取项目实际版本 } }
- 方案3:单测内临时修改 mock 值
如果不同测试用例需要不同的环境变量值,可以在测试代码中直接修改全局对象:
describe('getEnvVar 函数测试', () => { beforeEach(() => { // 每次测试用例执行前重置变量值 global.foo.env = { TEST_KEY: 'test_value' } }) it('可以正确读取存在的环境变量', () => { expect(getEnvVar('TEST_KEY')).toBe('test_value') }) it('读取不存在的变量时抛出预期错误', () => { expect(() => getEnvVar('NOT_EXIST')).toThrow('Could not find env var NOT_EXIST') }) })
类型报错处理
如果运行 TypeScript 测试时提示找不到 foo 的类型声明,确保你的 global.d.ts 被包含在 tsconfig.json 的 include 数组中,如果你有单独的测试用 tsconfig.test.json,也需要同步引入该类型文件。
内容的提问来源于stack exchange,提问作者clev
相关产品推荐
相关产品推荐

