Mock-objets et fixtures dans les tests TypeScript : du débutant au pro

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi les tests sans mocks sont comme un café sans caféine ?

\n\n

Imaginez : vous écrivez une application en TypeScript qui envoie des emails, communique avec une base de données et accède à une API externe. Vous lancez les tests — et tout échoue parce que le serveur de messagerie est temporairement indisponible. Ça vous dit quelque chose ?

\n\n

C'est là qu'interviennent les mock-objets (simulateurs) et les fixtures (données de test). Ils permettent d'isoler le code du monde extérieur et de rendre les tests rapides, fiables et prévisibles. Dans cet article en français, nous allons voir avec des exemples concrets comment utiliser correctement les mocks en TypeScript, quels sont les différents types de fixtures pour TypeScript et comment éviter les pièges.

\n\n

Cet article est rédigé pour PythonLib — un portail éducatif où nous apprenons à écrire du code de qualité. C'est parti !

\n\n

Que sont les mock-objets et les fixtures ?

\n\n

Mock-objets : des acteurs de doublure dans votre code

\n\n

Un mock-objet (ou simplement mock) est un remplacement d'un objet réel qui imite son comportement. Vous dites : "Quand la méthode sendEmail() sera appelée, retourne true". Et le test ne touche pas à la vraie messagerie.

\n\n

En TypeScript, les mocks sont le plus souvent créés avec les bibliothèques Jest ou Vitest. Elles permettent de vérifier qu'une méthode a été appelée, avec quels arguments et combien de fois.

\n\n

Fixtures : des données préparées pour les tests

\n\n

Les fixtures sont des ensembles de données préparées à l'avance. Par exemple, un objet utilisateur, une liste de commandes ou une configuration d'application. Au lieu de les créer manuellement à chaque fois, vous stockez les fixtures dans des fichiers séparés.

\n\n

La combinaison mock + fixture est la norme pour les tests TypeScript en 2024.

\n\n

Pratique : écrire des tests avec des mocks et des fixtures

\n\n

Configuration de l'environnement

\n\n

Pour les exemples, nous utiliserons Jest (bien que tout fonctionne aussi avec Vitest). Assurez-vous d'avoir installé les dépendances :

\n\n
npm install --save-dev jest @types/jest ts-jest
\n\n

Ajoutez dans jest.config.js :

\n\n
module.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n};
\n\n

Exemple 1 : Mock du service d'envoi d'email

\n\n

Supposons que nous ayons un service de notifications :

\n\n
// notificationService.ts\nexport class EmailService {\n  async sendEmail(to: string, subject: string, body: string): Promise<boolean> {\n    // Envoi réel — nous n'y touchons pas\n    return true;\n  }\n}\n\nexport class NotificationManager {\n  constructor(private emailService: EmailService) {}\n\n  async notifyUser(email: string, message: string): Promise<string> {\n    const result = await this.emailService.sendEmail(email, 'Notification', message);\n    return result ? 'Envoyé' : 'Erreur';\n  }\n}
\n\n

Écrivons maintenant un test avec un mock-objet :

\n\n
// notificationService.test.ts\nimport { NotificationManager, EmailService } from './notificationService';\n\ndescribe('NotificationManager', () => {\n  it('doit envoyer une notification et retourner "Envoyé"', async () => {\n    // Création du mock\n    const mockEmailService: jest.Mocked<EmailService> = {\n      sendEmail: jest.fn().mockResolvedValue(true),\n    };\n\n    const manager = new NotificationManager(mockEmailService);\n    const result = await manager.notifyUser('test@test.com', 'Bonjour !');\n\n    expect(result).toBe('Envoyé');\n    expect(mockEmailService.sendEmail).toHaveBeenCalledWith(\n      'test@test.com',\n      'Notification',\n      'Bonjour !'\n    );\n  });\n\n  it('doit retourner "Erreur" si l\'envoi échoue', async () => {\n    const mockEmailService: jest.Mocked<EmailService> = {\n      sendEmail: jest.fn().mockResolvedValue(false),\n    };\n\n    const manager = new NotificationManager(mockEmailService);                

Blogs

Book Recommendations