Estendere i Matcher
Vitest supporta sia Chai che Jest, offrendo la flessibilità di estendere i matcher tramite l'API chai.use o expect.extend, a seconda delle proprie preferenze.
Questa guida si concentrerà sull'estensione dei matcher con expect.extend. Per informazioni sull'API di Chai, si prega di consultare la loro guida.
Per estendere i matcher predefiniti, è sufficiente chiamare expect.extend passando un oggetto contenente le proprie implementazioni dei matcher.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// Non modificare il valore "pass" in base a isNot. Vitest lo gestisce automaticamente.
pass: received === 'foo',
message: () => `${received} is${isNot ? ' not' : ''} foo`,
};
},
});Se si utilizza TypeScript, è possibile estendere l'interfaccia Assertion predefinita in un file di dichiarazione ambientale (ad esempio: vitest.d.ts) con il seguente codice:
import '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 di ritorno di un matcher deve essere compatibile con la seguente interfaccia:
interface ExpectationResult {
pass: boolean;
message: () => string;
// Se questi valori sono forniti, appariranno automaticamente in un diff quando
// il matcher fallisce, eliminando la necessità di stampare il diff manualmente.
actual?: unknown;
expected?: unknown;
}WARNING
Se si crea un matcher asincrono, è necessario await il risultato (await expect('foo').toBeFoo()) all'interno del 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.
All'interno della funzione del matcher, il contesto this è accessibile e contiene le seguenti proprietà:
isNotRestituisce
truese il matcher è stato chiamato connot(expect(received).not.toBeFoo()).promiseSe il matcher è stato chiamato con
resolvedorejected, questo valore conterrà il nome del modificatore. Altrimenti, sarà una stringa vuota.equalsQuesta è una funzione di utilità che permette di confrontare due valori. Restituirà
truese i valori sono uguali,falsealtrimenti. Questa funzione è utilizzata internamente per quasi tutti i matcher e supporta oggetti con matcher asimmetrici per impostazione predefinita.utilsContiene un set di funzioni di utilità che possono essere utilizzate per formattare i messaggi.
Il contesto this contiene anche informazioni sul test corrente, che possono essere ottenute anche chiamando expect.getState(). Le proprietà più utili sono:
currentTestNameNome completo del test corrente (incluso il blocco
describe).testPathPercorso del file del test corrente.