Estensione dei Matchers
Vitest è compatibile sia con Chai che con Jest, quindi puoi utilizzare l'API chai.use o expect.extend, a seconda della tua preferenza.
Questa guida illustra come estendere i matcher utilizzando expect.extend. Se sei interessato all'API di Chai, consulta la loro guida.
Per estendere i matcher predefiniti, invoca expect.extend passando un oggetto contenente i tuoi matcher personalizzati.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// Non modificare il valore di "pass" in base a isNot. Vitest lo gestisce automaticamente.
pass: received === 'foo',
message: () => `${received} è${isNot ? ' non' : ''} foo`,
};
},
});Se utilizzi TypeScript, a partire da Vitest 0.31.0, puoi estendere l'interfaccia Assertion predefinita in un file di dichiarazione ambientale (ad esempio: vitest.d.ts) con il codice seguente:
import type { Assertion, AsymmetricMatchersContaining } from 'vitest';
interface CustomMatchers<R = unknown> {
toBeFoo(): R;
}
declare module 'vitest' {
interface Assertion<T = any> extends CustomMatchers<T> {}
interface AsymmetricMatchersContaining extends CustomMatchers {}
}WARNING
Non dimenticare di includere il file di dichiarazione ambientale nel tuo tsconfig.json.
Il valore restituito da un matcher deve essere conforme alla seguente interfaccia:
interface MatcherResult {
pass: boolean;
message: () => string;
// Se fornisci questi valori, appariranno automaticamente all'interno di un diff quando
// il matcher fallisce, quindi non è necessario stampare il diff manualmente.
actual?: unknown;
expected?: unknown;
}WARNING
Se crei un matcher asincrono, ricordati di utilizzare await sul risultato (await expect('foo').toBeFoo()) nel test stesso.
Il primo argomento della funzione di un matcher è il valore ricevuto (quello all'interno di expect(received)). Gli argomenti successivi sono quelli passati direttamente al matcher.
Il matcher ha accesso al contesto this con le seguenti proprietà:
isNotRestituisce
truese il matcher è stato invocato connot(expect(received).not.toBeFoo()).promiseSe il matcher è stato chiamato con
resolved/rejected, questa proprietà conterrà il nome del modificatore. Altrimenti, sarà una stringa vuota.equalsQuesta funzione di utilità permette di confrontare due valori. Restituirà
truese i valori sono uguali,falsealtrimenti. Questa funzione è utilizzata internamente da quasi tutti i matcher. Supporta gli oggetti con matcher asimmetrici per impostazione predefinita.utilsQuesto oggetto contiene un insieme di utility che puoi utilizzare per formattare i messaggi.
Il contesto this contiene anche informazioni sul test corrente. Puoi anche ottenerle chiamando expect.getState(). Le proprietà più utili includono:
currentTestNameNome completo del test corrente (incluso il blocco
describe).testPathPercorso del file di test corrente.