You need to enable JavaScript to run this app. Jest测试中基于process.env.NODE_ENV的配置判定逻辑未按预期生效
优惠活动
大模型
产品
解决方案
定价
更多

Jest测试中基于process.env.NODE_ENV的配置判定逻辑未按预期生效

测试失败核心原因
  • 模块导入求值时机错位:测试文件顶层的import config from 'consts/config'会在整个测试文件初始加载阶段就完成模块求值,后续哪怕执行环境变量修改、调用jest.resetModules(),已经完成初始化的config实例也不会重新运行内部判断逻辑,拿到的永远是首次加载时生成的旧值。
  • 环境变量取值通路断裂:原配置代码中直接使用裸全局NODE_ENV,而非从process.env.NODE_ENV读取取值。这类裸全局变量通常是打包工具在构建阶段做硬文本替换写入的,和测试运行时动态修改的process.env没有运行时关联,修改process.env根本无法影响该变量的实际取值。
  • 测试环境默认值干扰分支判断:jsdom运行时的默认hostname为localhost,原配置的判断逻辑会直接命中非生产分支,无论NODE_ENV取值如何,都会将USE_DEV_TOOLS设置为true。
修正实现方案
  • 调整配置源码的变量读取逻辑:将原配置中的裸NODE_ENV替换为process.env.NODE_ENV,打通运行时环境变量的读取通路。
  • 调整测试的模块加载逻辑:删除测试文件顶层的静态config导入,在每个测试用例完成环境变量设置、位置mock后,再通过动态导入的方式加载配置模块,配合jest.resetModules()确保每次获取的都是与当前测试环境匹配的全新求值实例。
  • 显式mockwindow.location属性:测试中把hostname设置为非dev/qa的生产域名,避开jsdom默认hostname触发的分支干扰,精准验证NODE_ENV的判断逻辑。

修正后的可运行测试代码:

describe('Environment variables', () => {
  const ORIGINAL_ENV = process.env
  const ORIGINAL_LOCATION = window.location

  beforeEach(() => {
    jest.resetModules()
    // 还原环境变量初始状态
    process.env = { ...ORIGINAL_ENV }
    // 模拟生产环境域名,避开dev/qa分支判断
    delete window.location
    window.location = { hostname: 'www.example.com' }
  })

  afterAll(() => {
    process.env = ORIGINAL_ENV
    // 还原原始window.location属性
    window.location = ORIGINAL_LOCATION
  })

  it('production does not use dev tools', async () => {
    process.env.NODE_ENV = 'production'
    // 环境变量设置完成后再动态加载配置模块
    const config = await import('consts/config')
    expect(config.USE_DEV_TOOLS).toBe(false)
  })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 15:06:07