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

如何在Vitest中正确设置/模拟process.env.NODE_ENV环境变量?

在Vitest中正确模拟NODE_ENV环境变量的解决方案

问题背景

我有一个类方法,仅当NODE_ENV === 'test'时才执行对应操作。编写测试用例时设置process.env.NODE_ENV = 'any_environment'来测试失败场景,但类方法校验时NODE_ENV仍保持初始值'test'——测试文件中打印能看到修改,但类无法感知该变化。该逻辑在Jest中可正常运行,需要解决Vitest中的环境变量设置问题。

解决方案

Vitest的模块预加载机制会导致类文件在测试前就已加载,直接修改process.env无法影响已加载模块的环境变量读取。可以通过以下两种方法解决:

方法一:使用Vitest内置的vi.stubEnv(推荐)

vi.stubEnv会在模块加载前就设置好环境变量,确保类读取到最新值,搭配重新导入类使用:

import { describe, it, expect, vi } from 'vitest';

describe('ExampleClass', () => {
  it('不执行操作当NODE_ENV不为test时', () => {
    vi.stubEnv('NODE_ENV', 'any_environment');
    // 重新导入类以读取新环境变量
    const ExampleClass = require('../src/example').default;
    const instance = new ExampleClass();
    
    expect(instance.performAction()).toBe(false);
  });

  it('执行操作当NODE_ENV为test时', () => {
    vi.stubEnv('NODE_ENV', 'test');
    const ExampleClass = require('../src/example').default;
    const instance = new ExampleClass();
    
    expect(instance.performAction()).toBe(true);
  });
});

方法二:清除模块缓存后重新导入

手动清除类模块的缓存,再重新导入,让类读取修改后的环境变量:

import { describe, it, expect } from 'vitest';

describe('ExampleClass', () => {
  it('不执行操作当NODE_ENV不为test时', () => {
    process.env.NODE_ENV = 'any_environment';
    // 清除模块缓存
    delete require.cache[require.resolve('../src/example')];
    // 重新导入类
    const ExampleClass = require('../src/example').default;
    const instance = new ExampleClass();
    
    expect(instance.performAction()).toBe(false);
  });
});

原因说明

Vitest默认在测试启动阶段预加载所有依赖模块,此时类已经读取了初始的NODE_ENV值。后续修改process.env不会回溯影响已加载模块的代码,而vi.stubEnv能在模块加载前注入环境变量,清除缓存重新导入则会让类重新读取当前的环境变量值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:55:23