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

如何在Vitest中全局模拟.env环境变量?

在Vitest中全局模拟.env环境变量的解决方案

核心问题分析

你当前的问题根源在于:测试函数中使用的是process.env.HASHNODE_URL,但setup/globalSetup文件里修改的是import.meta.env——这两个是不同的环境变量对象,所以修改不会生效。另外,globalSetup是在测试进程启动前运行的,无法直接修改测试上下文里的环境变量,因此也不适用。

解决方案

方案1:使用Vitest官方的vi.stubEnv(推荐)

Vitest提供了专门的vi.stubEnv方法来模拟环境变量,支持全局配置:

  1. 创建全局setup文件(比如test/setup-env.ts):
// test/setup-env.ts
import { vi } from 'vitest';

// 在所有测试前模拟环境变量
beforeAll(() => {
  vi.stubEnv('HASHNODE_URL', 'https://blog.IgorKrpenja.com');
});

// 测试结束后恢复环境变量
afterAll(() => {
  vi.unstubAllEnvs();
});
  1. 在vitest.config.ts中配置这个setup文件:
/// <reference types="vitest" />
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    setupFiles: ['./test/setup-env.ts'],
  },
});

这样所有测试套件都会自动应用这个环境变量,无需重复编写。

方案2:直接修改process.env(适配你当前的函数)

如果你不想修改现有代码中process.env的使用方式,可以直接在setup文件中修改process.env:

// test/setup-env.ts
beforeAll(() => {
  // 保存原始值(如果需要)
  globalThis.__originalHashnodeUrl = process.env.HASHNODE_URL;
  process.env.HASHNODE_URL = 'https://blog.IgorKrpenja.com';
});

afterAll(() => {
  // 恢复原始值
  process.env.HASHNODE_URL = globalThis.__originalHashnodeUrl;
  delete globalThis.__originalHashnodeUrl;
});

同样在vitest.config.ts中配置这个setup文件即可。

方案3:在Vitest配置中直接定义环境变量

如果你的环境变量是固定的测试值,可以直接在vitest.config.ts的test.env选项中配置:

/// <reference types="vitest" />
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    env: {
      HASHNODE_URL: 'https://blog.IgorKrpenja.com',
    },
  },
});

这种方式最简单,不需要额外的setup文件,Vitest会自动将这些变量注入到process.env和import.meta.env中。

TypeScript类型补充

如果TS提示import.meta.env或process.env不存在该变量,可以在项目的env.d.ts文件中添加类型声明:

// env.d.ts
interface ImportMetaEnv {
  readonly HASHNODE_URL: string;
}

interface ProcessEnv {
  readonly HASHNODE_URL: string;
}

这样就能避免类型报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:42:50