Extension des vérificateurs (Matchers)
Vitest étant compatible avec Chai et Jest, vous pouvez utiliser soit l'API chai.use, soit expect.extend, selon votre préférence.
Ce guide explique comment étendre les vérificateurs avec expect.extend. Si l'API de Chai vous intéresse, consultez leur guide.
Pour étendre les vérificateurs par défaut, appelez expect.extend avec un objet contenant vos vérificateurs personnalisés.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// Ne modifiez pas votre "pass" en fonction de isNot. Vitest le gère pour vous.
pass: received === 'foo',
message: () => `${received} n'est${isNot ? ' pas' : ''} foo`,
};
},
});Si vous utilisez TypeScript, à partir de Vitest 0.31.0, vous pouvez étendre l'interface Assertion par défaut dans un fichier de déclaration globale (par exemple : vitest.d.ts) avec le code ci-dessous :
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
N'oubliez pas d'inclure le fichier de déclaration d'environnement dans votre tsconfig.json.
La valeur retournée par un vérificateur doit correspondre à l'interface suivante :
interface MatcherResult {
pass: boolean;
message: () => string;
// Si vous les passez, ils apparaîtront automatiquement dans une diff lorsque
// le vérificateur échoue, vous n'avez donc pas besoin d'afficher la diff vous-même.
actual?: unknown;
expected?: unknown;
}WARNING
Si vous créez un vérificateur asynchrone, n'oubliez pas d'utiliser await pour le résultat (await expect('foo').toBeFoo()) dans le test lui-même.
Le premier argument d'une fonction de vérificateur est la valeur reçue (celle passée à expect(received)). Les arguments suivants sont passés directement au vérificateur.
La fonction de vérification a accès au contexte this avec les propriétés suivantes :
isNotRetourne
truesi le vérificateur est appelé avecnot(expect(received).not.toBeFoo()).promiseSi le vérificateur a été appelé avec
resolvedourejected, cette valeur contiendra le nom du modificateur. Sinon, ce sera une chaîne vide.equalsUne fonction utilitaire qui vous permet de comparer deux valeurs. Elle renvoie
truesi les valeurs sont égales, etfalsesinon. Cette fonction est utilisée en interne pour presque tous les vérificateurs. Elle prend en charge les objets avec des vérificateurs asymétriques par défaut.utilsContient un ensemble de fonctions utilitaires que vous pouvez utiliser pour formater les messages.
Le contexte this comprend également des informations sur le test en cours. Vous pouvez également l'obtenir en appelant expect.getState(). Les propriétés les plus utiles sont :
currentTestNameNom complet du test en cours (y compris le bloc
describe).testPathChemin d'accès au fichier de test actuel.