Ambiente de Teste
O Vitest oferece a opção environment para executar código em um ambiente específico. Você pode modificar o comportamento do ambiente com a opção environmentOptions.
Por padrão, você pode utilizar estes ambientes:
nodeé o ambiente padrão.jsdomemula o ambiente do navegador, fornecendo a API do Browser e utilizando o pacotejsdom.happy-domemula o ambiente do navegador, fornecendo a API do Browser. É considerado mais rápido que ojsdom, embora não possua algumas APIs. Ele utiliza o pacotehappy-dom.edge-runtimeemula o edge-runtime da Vercel, usando o pacote@edge-runtime/vm.
INFO
Ao usar os ambientes jsdom ou happy-dom, o Vitest segue as mesmas regras que o Vite ao importar CSS e assets. Se a importação de uma dependência externa falhar com o erro unknown extension .css, você precisará incluir manualmente toda a cadeia de importação, adicionando todos os pacotes a server.deps.external. Por exemplo, se o erro ocorrer em package-3 nesta cadeia de importação: código-fonte -> package-1 -> package-2 -> package-3, você precisa adicionar todos os três pacotes a server.deps.external.
As chamadas require de CSS e assets dentro das dependências externas são resolvidas automaticamente.
WARNING
"Ambientes" existem apenas ao executar testes no Node.js.
browser não é considerado um ambiente no Vitest. Se você deseja executar parte de seus testes no Modo Browser, você pode criar um projeto de teste.
Ambientes para Arquivos Específicos
Ao definir a opção environment em sua configuração, ela será aplicada a todos os arquivos de teste em seu projeto. Para ter um controle mais refinado, você pode usar comentários de controle para especificar o ambiente de arquivos específicos. Comentários de controle são aqueles que começam com @vitest-environment e são seguidos pelo nome do ambiente:
// @vitest-environment jsdom
import { expect, test } from 'vitest';
test('test', () => {
expect(typeof window).not.toBe('undefined');
});Ou você também pode definir a opção environmentMatchGlobs para especificar o ambiente com base nos padrões glob.
Ambiente Personalizado
Você pode criar seu próprio pacote para estender o ambiente do Vitest. Para fazer isso, crie um pacote nomeado vitest-environment-${name} ou especifique um caminho para um arquivo JS/TS válido. Esse pacote deve exportar um objeto no formato de Environment:
import type { Environment } from 'vitest/environments';
export default <Environment>{
name: 'custom',
transformMode: 'ssr',
// opcional - apenas se você der suporte ao pool "experimental-vm"
async setupVM() {
const vm = await import('node:vm');
const context = vm.createContext();
return {
getVmContext() {
return context;
},
teardown() {
// chamado depois que todos os testes com este ambiente tiverem sido executados
},
};
},
setup() {
// configuração personalizada
return {
teardown() {
// chamado depois que todos os testes com este ambiente tiverem sido executados
},
};
},
};WARNING
O Vitest exige a opção transformMode no objeto de ambiente. Ela deve ser igual a ssr ou web. Este valor determina como os plugins transformarão o código-fonte. Se estiver definido como ssr, os hooks do plugin receberão ssr: true ao transformar ou resolver arquivos. Caso contrário, ssr é definido como false.
Você também tem acesso aos ambientes padrão do Vitest através do módulo vitest/environments:
import { builtinEnvironments, populateGlobal } from 'vitest/environments';
console.log(builtinEnvironments); // { jsdom, happy-dom, node, edge-runtime }O Vitest também fornece a função utilitária populateGlobal, que pode ser usada para transferir propriedades de um objeto para o namespace global:
interface PopulateOptions {
// as funções que não são classes devem ser vinculadas ao namespace global
bindFunctions?: boolean;
}
interface PopulateResult {
// uma lista de todas as chaves que foram copiadas, mesmo que o valor não exista no objeto original
keys: Set<string>;
// um mapa dos valores originais do objeto que podem ter sido sobrescritos pelas chaves
// você pode retornar esses valores dentro da função `teardown`
originals: Map<string | symbol, any>;
}
export function populateGlobal(
global: any,
original: any,
options: PopulateOptions
): PopulateResult;