Tests unitaires avec Jest
Matchers essentiels, erreurs attendues, régressions.
Objectifs
À la fin de cette leçon, vous saurez :
- écrire et lancer des tests Jest ;
- utiliser les matchers essentiels ;
- tester les cas d'erreur attendus.
🔗 Pour vous rafraîchir la mémoire : package.json et scripts npm · modules : import/export
Le premier test
// math.spec.ts
import { calculerFrais } from "./math.js";
describe("calculerFrais", () => {
it("applique 0.29 pour la carte", () => {
expect(calculerFrais("carte")).toBe(0.29);
});
it("renvoie null pour un moyen inconnu", () => {
expect(calculerFrais("cheval" as never)).toBeNull();
});
});
npm test # ou npx jest
describe groupe, it décrit un comportement en phrase lisible. La sortie :
PASS src/math.spec.ts
calculerFrais
✓ applique 0.29 pour la carte (2 ms)
✓ renvoie null pour un moyen inconnu
Les matchers du quotidien
| Matcher | Vérifie |
|---|---|
toBe(x) | égalité stricte (===) |
toEqual(obj) | égalité profonde (contenu) |
toBeNull() / toBeDefined() | présence/absence |
toThrow() | l'appel rejette |
toContain(item) | appartenance |
toMatchObject(partiel) | sous-ensemble d'un objet |
Piège classique : objets et tableaux exigent toEqual, pas toBe — rappel du chapitre mémoire : deux objets au contenu identique ne sont jamais ===.
Tester l'erreur attendue
it("refuse un titre vide", () => {
expect(() => new Tache("")).toThrow("Titre requis");
});
La fonction est enveloppée dans une flèche : c'est le LANCEMENT qui doit rejeter. Sans elle, l'exception sort du test et le fait échouer brutalement sans vérifier le message.
Organiser ses tests
Conventions du projet Devmind : fichiers *.spec.ts à côté du code testé (admin.service.spec.ts teste admin.service.ts). Chaque spec suit le même plan que la classe testée : un describe par méthode publique, un it par comportement identifié (nominal + limites + erreurs).
Le réflexe TDD léger : avant de corriger un bug, écrivez le test qui l'aurait attrapé ; il échoue, vous corrigez, il passe — et il protège pour toujours contre la régression.
Exercice
- Testez
moyenne: nominal, liste vide → null, valeurs négatives. - Testez votre
basculer(t)immuable : l'original ne change pas. - Faites échouer volontairement un test et lisez le diff fourni par Jest.
- Pourquoi tester "l'original ne change pas" est-il précieux ici ?
Résumé
- describe/it + matchers : la grammaire minimale suffisante.
- Erreurs attendues : () => ... + toThrow.
- Un bug corrigé = un test de régression ajouté.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 4. L'immuabilité est un CONTRAT du chapitre POO : si quelqu'un « optimise » basculer en mutation, le test casse immédiatement et documente la violation. Les tests protègent aussi les décisions de design, pas seulement les calculs.