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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:15:04