测试环境
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 { , } from 'vitest'
('test', () => {
(typeof )..('undefined')
})
或者您也可以设置 environmentMatchGlobs
选项,根据 glob 模式指定环境。
自定义环境
从 0.23.0 开始,您可以创建自己的包来扩展 Vitest 环境。为此,请使用名称 vitest-environment-${name}
创建包或指定有效 JS/TS 文件的路径(从 0.34.0 开始支持)。该包应导出一个具有 Environment
形状的对象
ts
import type { Environment } from 'vitest'
export default <Environment>{
: 'custom',
: 'ssr',
// optional - only if you support "experimental-vm" pool
async () {
const = await import('node:vm')
const = .()
return {
() {
return
},
() {
// called after all tests with this env have been run
}
}
},
() {
// custom setup
return {
() {
// called after all tests with this env have been run
}
}
}
}
警告
从 0.34.0 开始,Vitest 在环境对象上需要 transformMode
选项。它应该等于 ssr
或 web
。此值决定插件如何转换源代码。如果它设置为 ssr
,插件钩子在转换或解析文件时将收到 ssr: true
。否则,ssr
设置为 false
。
您还可以通过 vitest/environments
条目访问默认的 Vitest 环境
ts
import { , } from 'vitest/environments'
.() // { 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