如何在Vitest中为SvelteKit项目配置测试环境变量?
解决SvelteKit测试中环境变量未加载的问题
问题原因
你使用的$env/dynamic/private是SvelteKit运行时动态读取环境变量的方式,而Vitest的test.env配置不会自动注入到这个模块的env对象中,导致测试时无法获取到配置的APP_PASSWORD。
解决方案
方案1:Mock $env/dynamic/private模块
在测试文件中直接mock该模块,返回测试所需的环境变量:
// 在你的测试文件顶部添加 vi.mock("$env/dynamic/private", () => ({ env: { APP_PASSWORD: "testing password", FILE_DIRECTORY: "test/files" // 可选,根据测试需求设置 } })); // 之后导入config模块 import { config } from "$lib/config"; // 替换成你的config.ts实际路径 // 编写测试用例 test("config loads correctly in test", () => { expect(config.password).toBe("testing password"); });
方案2:使用测试专用.env文件
- 在项目根目录创建
.env.test文件,添加测试用的环境变量:
APP_PASSWORD=testing password FILE_DIRECTORY=test/files
- 修改
vite.config.ts,在测试模式下加载这个.env文件:
import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vitest/config'; import { loadEnv } from 'vite'; export default defineConfig(({ mode }) => { // 加载对应模式的env文件 const env = loadEnv(mode, process.cwd(), ''); return { plugins: [sveltekit()], resolve: process.env.VITEST ? { conditions: ['browser'] } : undefined, test: { include: ["./test/**/*.ts"], // 将加载的env注入到测试环境 env: { ...env } } }; });
运行测试时需要指定模式为test,比如执行vitest --mode test。
方案3:改用$env/static/private(如果适合你的场景)
如果你的配置不需要运行时动态更新,可以改用静态环境变量:
- 修改
config.ts:
import { APP_PASSWORD, FILE_DIRECTORY } from "$env/static/private"; function getOrThrow(propertyName: string, optionalValue: string | undefined): string { if (optionalValue === undefined) { throw new Error(`[ ${propertyName} ] was not set in .env file!`); } return optionalValue; } export const config = { password: getOrThrow("APP_PASSWORD", APP_PASSWORD), fileDirectory: FILE_DIRECTORY ?? "dist/files" };
此时Vitest的test.env配置会正确注入到$env/static/private导出的变量中,不需要额外修改测试代码。
内容的提问来源于stack exchange,提问作者Skater901
相关产品推荐
相关产品推荐

