如何在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
相关产品推荐
相关产品推荐

