javascript单元测试伪造环境变量的核心是绕过真实process.env读取、改用可控模拟值且不污染全局状态;推荐vitest用vi.stubenv()自动恢复,jest可用jest.mock()拦截配置模块,简单场景可beforeeach/aftereach手动赋值清理。

在 JavaScript 单元测试中伪造环境变量,核心是**绕过真实 process.env 读取,改用可控的模拟值**,同时避免污染全局状态。不同测试框架(如 Jest、Vitest)有对应机制,但原则一致:不修改真实环境,只在测试作用域内临时生效。
直接赋值 + 恢复(适用于简单场景)
对于纯逻辑函数(不依赖 Node.js 启动时的 env 初始化),可在测试前后手动设置和清理:
- 测试前用
process.env.MY_API_KEY = "test-key"赋值 - 测试后用
delete process.env.MY_API_KEY或process.env.MY_API_KEY = undefined清理 - 推荐配合
beforeEach/afterEach使用,确保每个测试独立
使用 Jest 的 jest.mock() 拦截模块级环境读取
若配置加载逻辑封装在独立模块(如 config.ts)中,且该模块内部直接读取 process.env,可 mock 整个模块:
- 在测试文件顶部写
jest.mock('../src/config', () => ({ getDbUrl: () => process.env.DB_URL || 'fallback-url' })) - 再在测试中动态设置
process.env.DB_URL = 'test-url',模块就会返回你期望的值 - 这种方式隔离性强,不影响其他测试,适合配置解析类逻辑
Vitest 中用 vi.stubEnv()(推荐)
Vitest 提供了更安全、更语义化的 API:
-
vi.stubEnv('NODE_ENV', 'test')—— 设置单个变量 -
vi.stubEnv({ NODE_ENV: 'test', API_BASE_URL: 'http://localhost' })—— 批量设置 - 执行后会自动在
afterEach恢复原始值,无需手动清理 - 比直接操作
process.env更可靠,尤其在并发测试或 ESM 环境下
避免常见陷阱
伪造环境变量容易踩坑,注意这几点:
- 不要在
describe外层直接改process.env,会导致跨测试污染 - 如果被测代码在模块顶层就读取了
process.env(比如const URL = process.env.API_URL),赋值必须在import之前完成 —— 此时应改用vi.hoisted或提前 mock 模块 - TS 类型提示可能报错,可用
(process.env as any).KEY = value或扩展NodeJS.ProcessEnv接口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











