Assertions et matchers : Comment comparer correctement les données ?

Le point de vérification dans tout test est la méthode matcher appelée après expect(). Les développeurs débutants utilisent souvent seulement toBe(), mais le choix d'un mauvais matcher peut conduire à des faux positifs ou à des messages d'erreur illisibles lors de l'échec de la construction.

1. Égalité stricte contre égalité profonde

Les deux matchers principaux pour vérifier l'égalité des valeurs sont toBe() et toEqual(). Comprendre la différence entre eux est critique :

  • toBe() : Vérifie les valeurs pour l'égalité stricte (===). Idéal pour comparer les primitives (nombres, chaînes, booléens, symboles).
  • toEqual() : Vérifie les objets et tableaux pour l'égalité structurelle profonde. Il compare récursivement toutes les propriétés des objets et éléments des tableaux, sans se soucier de savoir si les variables référencent le même objet en mémoire.
Prudence

Une erreur typique — comparer des objets avec toBe() :

expect({ id: 1 }).toBe({ id: 1 }); // Erreur ! Les références en mémoire sont différentes, le test ÉCHOUE.
expect({ id: 1 }).toEqual({ id: 1 }); // Passe ! Le contenu des objets correspond complètement.
``

2. Matchers populaires pour différents types de données

Vitest contient un riche ensemble de méthodes pour des vérifications ciblées :

Comparaison de nombres :

  • toBeGreaterThan(x) / toBeLessThan(x) — plus grand / plus petit que x.
  • toBeGreaterThanOrEqual(x) / toBeLessThanOrEqual(x) — plus grand ou égal / plus petit ou égal.
  • toBeCloseTo(value, precision) — utilisé pour comparer les nombres à virgule flottante (nombres décimaux), pour éviter les problèmes de précision d'arrondi en JS (par exemple, 0.1 + 0.2 === 0.30000000000000004).

Vérification de chaînes et tableaux :

  • toContain(element) — vérifie la présence d'une sous-chaîne dans une chaîne ou d'un élément dans un tableau.
  • toHaveLength(len) — vérifie la longueur d'un tableau ou d'une chaîne.
  • toMatch(regexOrString) — compare une valeur de chaîne avec une expression régulière.

Vérification de types spécifiques :

  • toBeNull() / toBeUndefined() / toBeDefined() / toBeTruthy() / toBeFalsy().

3. Vérification des erreurs (Exceptions)

Si une fonction doit lancer une erreur (par exemple, lors de la réception d'arguments invalides), nous vérifions cela avec le matcher toThrow() ou toThrowError().

Important

Lors du test des erreurs, vous devez passer à expect() la fonction elle-même, et non l'appeler ! Sinon, l'erreur sera lancée avant même le début de la vérification, et le test échouera.

// INCORRECT (le test échouera immédiatement avec une erreur non gérée) :
expect(parseAge(-5)).toThrow();

// CORRECT (enveloppons l'appel dans une fonction anonyme) :
expect(() => parseAge(-5)).toThrow('L'âge ne peut pas être négatif');
``