Outils & qualité · 4 mondes · 12 étapes

Tests & déploiement

Des tests qui attrapent les bugs, une chaîne qui vérifie tout, une mise en production sans frayeur.

Progression

0 %

0/12 étapes terminées

Intermédiaire · 9 min de lecture

Doubles et déterminisme

Des tests rapides, isolés, identiques à chaque fois

1Définition

Un double de test remplace une dépendance lente ou extérieure (base, e-mail, réseau) : le bouchon renvoie une réponse fixée, l'espion enregistre en plus ses appels. Pour les utiliser, le code reçoit ses dépendances en paramètres — l'injection de dépendances — y compris l'heure et le hasard, ce qui le rend déterministe.

2Principes fondamentaux

01

Injecter plutôt qu'importer

Une dépendance reçue en paramètre se remplace sans toucher au code testé.

02

Vérifier les appels

Un espion dit combien de fois, et avec quels arguments, une dépendance a été appelée.

03

Figer l'heure et le hasard

maintenant et alea en paramètres : mêmes entrées, même sortie.

04

Pas de test instable

Un test qui échoue « parfois » est rendu déterministe, ou supprimé.

3Exemples pratiques

Un espion avec Vitest

Exemple
1const envoyerMail = vi.fn();2await inscrire("awa", { enregistrer: vi.fn().mockResolvedValue({ id: 7 }), envoyerMail });3expect(envoyerMail).toHaveBeenCalledOnce();4expect(envoyerMail).toHaveBeenCalledWith("awa", "Bienvenue sur Sys-Code !");

vi.fn() est l'espion du cours, avec des assertions prêtes à l'emploi.

Figer l'horloge

Exemple
1vi.useFakeTimers();2vi.setSystemTime(new Date("2026-01-03T00:00:00Z"));3// Date.now() renvoie maintenant toujours la même valeur

Utile pour du code existant ; pour du code neuf, un paramètre maintenant reste plus simple.

4Erreurs courantes

Appeler Date.now() au cœur de la logique

À éviter

return Date.now() - visite < 48 * HEURE;

À faire

return maintenant - visite < 48 * HEURE;

Pourquoi : Impossible de tester la limite des 48 heures sans attendre.

Vérifier seulement le nombre d'appels

À éviter

expect(notifier.appels.length).toBe(1);

À faire

expect(notifier.appels).toEqual([["awa", "Ta série de 5 jours t'attend !"]]);

Pourquoi : Un mauvais message passerait inaperçu.

Tout remplacer par des doubles

À éviter

// la fonction testée est elle-même simulée

À faire

Doubler les dépendances, jamais le code testé

Pourquoi : On ne teste alors plus rien.

5Subtilités à connaître

  • ◆Trop de doubles rendent les tests fragiles : ils figent la façon dont le code parle à ses dépendances. On double les frontières (réseau, base, horloge), pas chaque fonction.
  • ◆Un « faux » (une vraie base en mémoire, par exemple) teste davantage qu'un bouchon, au prix d'un peu de code.
  • ◆Les tests d'intégration, eux, utilisent de vraies dépendances — une base de test — et complètent les tests unitaires.

6Vérifie ta compréhension

Question 1/3

Score 0

Un espion…

Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.