Тестовая среда
Vitest предоставляет опцию environment
для запуска кода в определенной среде. Вы можете изменить поведение среды с помощью опции environmentOptions
.
По умолчанию доступны следующие среды:
node
- среда по умолчаниюjsdom
эмулирует окружение браузера, предоставляя Browser API. Использует пакетjsdom
happy-dom
также эмулирует окружение браузера, предоставляя Browser API. Считается более быстрым, чем jsdom, но не поддерживает некоторые API. Использует пакетhappy-dom
edge-runtime
эмулирует edge-runtime от Vercel. Использует пакет@edge-runtime/vm
Среды для определенных файлов
При установке опции environment
в конфигурации, она применяется ко всем тестовым файлам проекта. Для более точной настройки можно использовать специальные комментарии, чтобы указать среду для отдельных файлов. Эти комментарии начинаются с @vitest-environment
, за которым следует имя среды:
// @vitest-environment jsdom
import { expect, 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
:
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() {
// вызывается после выполнения всех тестов с этой средой
},
};
},
setup() {
// custom setup
return {
teardown() {
// вызывается после выполнения всех тестов с этой средой
},
};
},
};
WARNING
Начиная с версии 0.34.0, Vitest требует указания опции transformMode
в объекте среды. Она должна быть равна ssr
или web
. Это значение определяет, как плагины будут преобразовывать исходный код. Если установлено значение ssr
, хуки плагина будут получать ssr: true
при преобразовании или разрешении файлов, иначе ssr
будет false
.
У вас также есть доступ к средам Vitest по умолчанию через запись vitest/environments
:
import { builtinEnvironments, populateGlobal } from 'vitest/environments';
console.log(builtinEnvironments); // { jsdom, happy-dom, node, edge-runtime }
Vitest также предоставляет утилиту populateGlobal
для перемещения свойств из объекта в глобальное пространство имен.
interface PopulateOptions {
// следует ли привязывать функции, не являющиеся классами, к глобальному пространству имен
bindFunctions?: boolean;
}
interface PopulateResult {
// список всех скопированных ключей, даже если значение не существует в исходном объекте
keys: Set<string>;
// карта исходного объекта, который мог быть переопределен ключами
originals: Map<string | symbol, any>;
}
export function populateGlobal(
global: any,
original: any,
options: PopulateOptions
): PopulateResult;