跳至内容

测试环境

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 选项。它应该等于 ssrweb。此值决定插件如何转换源代码。如果它设置为 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