テスト環境
Vitestにはenvironment
オプションがあり、特定の環境内でコードを実行できます。environmentOptions
オプションを使用して、環境の動作を変更できます。
既定では、次の環境を使用できます
node
は既定の環境ですjsdom
はjsdom
パッケージを使用して、ブラウザAPIを提供することでブラウザ環境をエミュレートしますhappy-dom
はhappy-dom
パッケージを使用して、ブラウザAPIを提供することでブラウザ環境をエミュレートします。jsdomよりも高速とされていますが、一部のAPIがありませんedge-runtime
はedge-runtimeをエミュレートし、@edge-runtime/vm
パッケージを使用します
特定のファイルの環境
コンフィグでenvironment
オプションを設定すると、プロジェクト内のすべてのテストファイルに適用されます。さらにきめ細やかに制御するには、特定のファイルの環境を指定するための制御コメントを使用できます。制御コメントは@vitest-environment
で始まり、環境名が続くコメントです。
// @vitest-environment jsdom
import { , } from 'vitest'
('test', () => {
(typeof )..('undefined')
})
また、environmentMatchGlobs
オプションを設定して、globパターンに基づいて環境を指定することもできます。
カスタム環境
0.23.0以降、独自のパッケージを作成してVitest環境を拡張できます。これを行うには、vitest-environment-${name}
という名前のパッケージを作成するか、有効なJS/TSファイルへのパスを指定します(0.34.0以降でサポートされています)。そのパッケージはEnvironment
の形をしたオブジェクトをエクスポートする必要があります。
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環境にアクセスすることもできます
import { , } from 'vitest/environments'
.() // { jsdom, happy-dom, node, edge-runtime }
Vitestには、オブジェクトからグローバル名前空間にプロパティを移動するために使用できるpopulateGlobal
ユーティリティ関数も用意されています
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