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
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
1vi.useFakeTimers();2vi.setSystemTime(new Date("2026-01-03T00:00:00Z"));3// Date.now() renvoie maintenant toujours la même valeurUtile 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.