Ambienti di Test
Vitest offre l'opzione environment
per eseguire il codice in un ambiente specifico. Puoi personalizzare il comportamento dell'ambiente con l'opzione environmentOptions
.
Per impostazione predefinita, sono disponibili i seguenti ambienti:
node
: è l'ambiente predefinito.jsdom
: emula l'ambiente del browser fornendo le API del browser. Utilizza il pacchettojsdom
.happy-dom
: emula l'ambiente del browser fornendo le API del browser ed è considerato più veloce di jsdom, ma non implementa tutte le API. Utilizza il pacchettohappy-dom
.edge-runtime
: emula l'edge-runtime di Vercel. Utilizza il pacchetto@edge-runtime/vm
.
Ambienti per File Specifici
Quando l'opzione environment
è impostata nella configurazione, si applica a tutti i file di test del progetto. Per un controllo più preciso, puoi specificare l'ambiente per singoli file tramite commenti di controllo. I commenti di controllo iniziano con @vitest-environment
e sono seguiti dal nome dell'ambiente:
// @vitest-environment jsdom
import { test } from 'vitest';
test('test', () => {
expect(typeof window).not.toBe('undefined');
});
In alternativa, puoi utilizzare l'opzione environmentMatchGlobs
per specificare l'ambiente in base a pattern glob.
Ambiente Personalizzato
A partire dalla versione 0.23.0, è possibile creare un pacchetto personalizzato per estendere l'ambiente Vitest. Per farlo, crea un pacchetto denominato vitest-environment-${name}
oppure specifica il percorso di un file JS valido (supportato a partire dalla versione 0.34.0). Questo pacchetto deve esportare un oggetto con la struttura di 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() {
// chiamato dopo l'esecuzione di tutti i test con questo ambiente
},
};
},
setup() {
// setup personalizzato
return {
teardown() {
// chiamato dopo l'esecuzione di tutti i test con questo ambiente
},
};
},
};
WARNING
A partire dalla versione 0.34.0, Vitest richiede l'opzione transformMode
nell'oggetto environment. Deve essere uguale a ssr
o web
. Questo valore determina la modalità di trasformazione del codice sorgente da parte dei plugin. Se è impostato su ssr
, gli hook del plugin riceveranno ssr: true
durante la trasformazione o la risoluzione dei file. Altrimenti, ssr
sarà impostato su false
.
Puoi anche accedere agli ambienti Vitest predefiniti 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 può essere utilizzata per spostare le proprietà da un oggetto allo spazio dei nomi globale:
interface PopulateOptions {
// indica se le funzioni non-classe devono essere associate 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 nell'oggetto originale
keys: Set<string>;
// una mappa dell'oggetto originale che potrebbe essere stato sovrascritto con le chiavi
originals: Map<string | symbol, any>;
}
export function populateGlobal(
global: any,
original: any,
options: PopulateOptions
): PopulateResult;