Ambiente di Test
Vitest offre l'opzione environment per eseguire il codice all'interno di un ambiente specifico. Il comportamento dell'ambiente può essere ulteriormente personalizzato tramite l'opzione environmentOptions.
Per impostazione predefinita, sono disponibili i seguenti ambienti:
node: l'ambiente predefinito.jsdom: emula l'ambiente browser fornendo le API del browser, utilizzando il pacchettojsdom.happy-dom: emula l'ambiente browser fornendo le API del browser ed è considerato più veloce rispetto ajsdom, sebbene possa mancare di alcune API. Utilizza il pacchettohappy-dom.edge-runtime: emula l'edge-runtime di Vercel, utilizzando il pacchetto@edge-runtime/vm.
INFO
Quando si utilizzano gli ambienti jsdom o happy-dom, Vitest segue le stesse regole di Vite per l'importazione di CSS e assets. Se l'importazione di una dipendenza esterna restituisce l'errore unknown extension .css, è necessario includere manualmente l'intera catena di importazione aggiungendo tutti i pacchetti a server.deps.external. Ad esempio, se l'errore si verifica in package-3 all'interno della catena di importazione: codice sorgente -> package-1 -> package-2 -> package-3, è necessario aggiungere tutti e tre i pacchetti a server.deps.external.
A partire da Vitest 2.0.4, il require di CSS e asset all'interno delle dipendenze esterne viene risolto automaticamente.
WARNING
Gli "ambienti" esistono solo durante l'esecuzione dei test in Node.js.
browser non è considerato un ambiente in Vitest. Se si desidera eseguire parte dei test in Modalità Browser, è possibile creare un progetto workspace.
Ambienti per File Specifici
Impostando l'opzione environment nella configurazione, essa si applicherà a tutti i file di test del progetto. Per un controllo più granulare, è possibile utilizzare i commenti di controllo per specificare l'ambiente per file specifici. I commenti di controllo iniziano con @vitest-environment e sono seguiti dal nome dell'ambiente:
// @vitest-environment jsdom
import { expect, test } from 'vitest';
test('test', () => {
expect(typeof window).not.toBe('undefined');
});In alternativa, è possibile impostare l'opzione environmentMatchGlobs specificando l'ambiente in base a pattern glob.
Ambiente Personalizzato
È possibile creare un pacchetto per estendere l'ambiente di Vitest. Per farlo, è necessario creare un pacchetto denominato vitest-environment-${name} o specificare un percorso a un file JS/TS valido. Il pacchetto deve esportare un oggetto conforme all'interfaccia Environment:
import type { Environment } from 'vitest';
export default <Environment>{
name: 'custom',
transformMode: 'ssr',
// opzionale - solo se si supporta il pool "experimental-vm"
async setupVM() {
const vm = await import('node:vm');
const context = vm.createContext();
return {
getVmContext() {
return context;
},
teardown() {
// chiamato dopo che tutti i test con questo ambiente sono stati eseguiti
},
};
},
setup() {
// configurazione personalizzata
return {
teardown() {
// chiamato dopo che tutti i test con questo ambiente sono stati eseguiti
},
};
},
};WARNING
Vitest richiede l'opzione transformMode nell'oggetto ambiente. Questo valore deve essere ssr o web e determina come i plugin trasformeranno il codice sorgente. Se impostato su ssr, gli hook dei plugin riceveranno ssr: true durante la trasformazione o la risoluzione dei file. Altrimenti, ssr è impostato su false.
Si ha anche accesso agli ambienti predefiniti di Vitest tramite l'entry vitest/environments:
import { builtinEnvironments, populateGlobal } from 'vitest/environments';
console.log(builtinEnvironments); // { jsdom, happy-dom, node, edge-runtime }Vitest fornisce inoltre la funzione di utilità populateGlobal, che consente di trasferire le proprietà da un oggetto allo spazio dei nomi globale:
interface PopulateOptions {
// le funzioni non di classe devono essere legate allo spazio dei nomi globale
bindFunctions?: boolean;
}
interface PopulateResult {
// un elenco di tutte le chiavi che sono state copiate, anche se il valore non esiste sull'oggetto originale
keys: Set<string>;
// una mappa dell'oggetto originale che potrebbe essere stato sovrascritto con le chiavi
// è possibile restituire questi valori all'interno della funzione `teardown`
originals: Map<string | symbol, any>;
}
export function populateGlobal(
global: any,
original: any,
options: PopulateOptions
): PopulateResult;