测试环境
Vitest 提供了 environment
选项,用于在特定环境中运行代码。你可以使用 environmentOptions
选项来调整环境的行为。
默认情况下,以下环境可供使用:
node
:默认环境。jsdom
:通过提供浏览器 API 来模拟浏览器环境,使用jsdom
包。happy-dom
:通过提供浏览器 API 来模拟浏览器环境,通常比 jsdom 更快,但缺少一些 API,使用happy-dom
包。edge-runtime
:模拟 Vercel 的 edge-runtime,使用@edge-runtime/vm
包。
特定文件的环境
如果在配置中设置了 environment
选项,它将应用于项目中的所有测试文件。为了更精细地控制测试环境,你可以使用控制注释来指定特定文件的环境。控制注释是以 @vitest-environment
开头,后跟环境名称的注释:
ts
// @vitest-environment jsdom
import { test } from 'vitest';
test('test', () => {
expect(typeof window).not.toBe('undefined');
});
或者,你也可以设置 environmentMatchGlobs
选项,以根据 glob 模式指定环境。
自定义环境
从 0.23.0 开始,你可以创建自己的包来扩展 Vitest 环境。为此,可以创建一个名称为 vitest-environment-${name}
的包,或者指定一个有效的 JS 文件路径(自 0.34.0 起支持)。该包应导出一个符合 Environment
接口的对象:
ts
import type { Environment } from 'vitest';
export default <Environment>{
name: 'custom',
transformMode: 'ssr',
// optional - only if you support "experimental-vm" pool
async setupVM() {
const vm = await import('node:vm');
const context = vm.createContext();
return {
getVmContext() {
return context;
},
teardown() {
// called after all tests with this env have been run
},
};
},
setup() {
// custom setup
return {
teardown() {
// called after all tests with this env have been run
},
};
},
};
WARNING
自 0.34.0 起,Vitest 要求环境对象必须包含 transformMode
选项。它必须是 ssr
或 web
。该值决定了插件转换源代码的方式。如果设置为 ssr
,插件钩子在转换或解析文件时将收到 ssr: true
。否则,ssr
将设置为 false
。
你还可以通过 vitest/environments
入口访问默认的 Vitest 环境。
ts
import { builtinEnvironments, populateGlobal } from 'vitest/environments';
console.log(builtinEnvironments); // { jsdom, happy-dom, node, edge-runtime }
Vitest 还提供了 populateGlobal
实用函数,用于将对象属性移动到全局命名空间。
ts
interface PopulateOptions {
// should non-class functions be bind to the global namespace
bindFunctions?: boolean;
}
interface PopulateResult {
// a list of all keys that were copied, even if value doesn't exist on original object
keys: Set<string>;
// a map of original object that might have been overridden with keys
// you can return these values inside `teardown` function
originals: Map<string | symbol, any>;
}
export function populateGlobal(
global: any,
original: any,
options: PopulateOptions
): PopulateResult;