Frontend Academy · Leçon

Simuler des modules et des appels d’API

Simulez des modules ES avec jest.mock(), remplacez fetch par MSW (Mock Service Worker) et testez des composants dépendant de données externes sans effectuer de véritables appels réseau.

Leçon 4 sur 412 étapes

Simuler des modules et des appels d’API est une leçon Frontend Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Frontend Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Frontend Academy comprend 4 leçons au total.

Pourquoi simuler ?

Les tests unitaires doivent être isolés. Les appels réels aux API sont lents, peu fiables et coûteux. La simulation remplace les dépendances par des doublures de test contrôlées qui renvoient des réponses prévisibles.

jest.mock() — simuler des modules entiers

jest.mock('module-path') remplace le module entier par des versions simulées automatiquement. Tous les exports deviennent des stubs jest.fn(). Appelez mockReturnValue ou mockResolvedValue pour définir les valeurs de retour.

jest.mock('./api');
import { fetchUser } from './api';

(fetchUser as jest.Mock).mockResolvedValue({ id: 1, name: 'Alice' });

test('renders user name', async () => {
  render(<Profile userId="1" />);
  await screen.findByText('Alice');
  expect(fetchUser).toHaveBeenCalledWith('1');
});

jest.fn() — stubs manuels

jest.fn() crée une fonction simulée dont vous pouvez suivre et contrôler l’exécution. C’est utile pour les props de fonctions de rappel et les dépendances de services.

const onSubmit = jest.fn();
render(<Form onSubmit={onSubmit} />);

await user.click(screen.getByRole('button', { name: /submit/i }));

expect(onSubmit).toHaveBeenCalledOnce();
expect(onSubmit).toHaveBeenCalledWith({ email: 'alice@example.com' });

Réinitialiser les simulations avec beforeEach

Réinitialisez les simulations entre les tests pour empêcher les fuites d’état. Utilisez jest.clearAllMocks() dans beforeEach.

beforeEach(() => {
  jest.clearAllMocks(); // reset call counts and implementations
});

afterAll(() => {
  jest.restoreAllMocks(); // restore original implementations
});

MSW — Mock Service Worker

MSW intercepte les appels réels de récupération/XHR au niveau du réseau en utilisant des workers de service (navigateur) ou des intercepteurs Node.js (tests). Écrivez des gestionnaires de requêtes qui renvoient de fausses réponses.

import { setupServer } from 'msw/node';
import { http, HttpResponse } from 'msw';

const server = setupServer(
  http.get('/api/users', () => {
    return HttpResponse.json([{ id: 1, name: 'Alice' }]);
  })
);

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

Remplacements de MSW par test

Remplacez le gestionnaire par défaut pour un scénario de test précis.

test('handles server error', async () => {
  server.use(
    http.get('/api/users', () => new HttpResponse(null, { status: 500 }))
  );

  render(<UserList />);
  await screen.findByText(/server error/i);
});

Simulation de localStorage

Utilisez jest.spyOn pour simuler les méthodes de stockage Web dans les tests qui utilisent localStorage.

beforeEach(() => {
  const store: Record<string, string> = {};
  jest.spyOn(Storage.prototype, 'getItem').mockImplementation((key) => store[key] ?? null);
  jest.spyOn(Storage.prototype, 'setItem').mockImplementation((key, val) => { store[key] = val; });
});

Simulation des minuteurs

jest.useFakeTimers() remplace setTimeout/setInterval par des versions contrôlées par Jest. jest.runAllTimers() fait avancer rapidement tous les minuteurs.

jest.useFakeTimers();

test('shows toast for 3 seconds', () => {
  render(<Toast message="Saved!" />);
  expect(screen.getByText('Saved!')).toBeInTheDocument();

  jest.advanceTimersByTime(3000);
  expect(screen.queryByText('Saved!')).not.toBeInTheDocument();
});

afterEach(() => jest.useRealTimers());

Motif de fabrique de modules

Avec TypeScript, les fabriques de modules simulées renvoient les types appropriés.

jest.mock('./services/auth', () => ({
  login: jest.fn().mockResolvedValue({ token: 'test-token' }),
  logout: jest.fn()
}));

Tests par instantané — À utiliser avec modération

Les tests par instantané enregistrent une représentation sérialisée de la sortie d'un composant et échouent si elle change. Ils sont faciles à créer, mais peuvent produire de nombreux faux positifs. Utilisez-les uniquement pour des composants de présentation stables et purs.

Vérification rapide

Quel est le principal avantage de MSW par rapport à jest.mock('fetch') pour simuler une API ?

Récapitulatif : simulation

jest.mock() remplace les modules. jest.fn() crée des doublures traçables. Réinitialisez les simulations dans beforeEach. MSW intercepte HTTP au niveau du réseau — l'approche de simulation la plus réaliste. Utilisez les remplacements server.use() par test pour les scénarios d'erreur. Utilisez de faux minuteurs pour le code dépendant du temps. Préférez MSW pour les tests d'intégration des composants.

Gratuit pour commencer

Apprends HTML avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
41
Leçons
163

Questions Fréquemment Posées

La leçon « Simuler des modules et des appels d’API » est-elle gratuite ?

Oui — le texte complet de « Simuler des modules et des appels d’API » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Frontend Academy, passe à CoddyKit PRO. Le cours Frontend Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Simuler des modules et des appels d’API » ?

Simulez des modules ES avec jest.mock(), remplacez fetch par MSW (Mock Service Worker) et testez des composants dépendant de données externes sans effectuer de véritables appels réseau. Tu pratiques Frontend Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Frontend Academy ?

Aucune expérience préalable n'est requise. Frontend Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Simuler des modules et des appels d’API » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Frontend Academy ?

Oui. Chaque leçon Frontend Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Configuration de Jest et tests de base
  2. @testing-library/react : render et userEvent
  3. @testing-library/vue : monter des composants
  4. Simuler des modules et des appels d’API
← Retour à Frontend Academy