nock pour TypeScript : guide complet avec exemples

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

nock pour TypeScript : le mocking HTTP dans les tests

1. Qu'est-ce que nock et pourquoi l'utiliser ?

nock est une bibliothèque puissante pour Node.js, conçue pour intercepter et simuler des requêtes HTTP. Elle permet aux développeurs d'imiter les réponses de services externes (API REST, microservices tiers, webhooks) sans avoir à effectuer de véritables appels réseau. C'est particulièrement crucial lors de l'écriture de tests unitaires et d'intégration, où la stabilité et la rapidité d'exécution sont primordiales.

Pourquoi est-ce nécessaire ? Imaginez que votre application envoie des requêtes à une passerelle de paiement, une API météo ou une base de données via HTTP. Dans un environnement de test, vous ne voulez pas dépendre de la disponibilité de ces services, de leur temps de réponse ou de leurs limites de requêtes. nock vous permet de "remplacer" ces requêtes en renvoyant des données prédéfinies. Cela rend les tests rapides, prévisibles et isolés des facteurs externes. De plus, vous pouvez tester des scénarios d'erreur (timeouts, codes 500, réponses vides) qui sont difficiles à reproduire en conditions réelles.

Dans le contexte de TypeScript, nock s'intègre parfaitement avec les frameworks de test populaires (Jest, Mocha, Vitest) et prend en charge la typage, ce qui rend son utilisation à la fois pratique et sécurisée. La bibliothèque intercepte les requêtes au niveau de Node.js (via les modules http et https), elle fonctionne donc avec n'importe quel client HTTP : axios, node-fetch, got et même le fetch natif (avec quelques réserves).

2. Installation

Pour installer nock dans un projet TypeScript, exécutez l'une des commandes suivantes dans votre terminal :

# Avec npm
npm install --save-dev nock @types/nock

# Avec yarn
yarn add --dev nock @types/nock

# Avec pnpm
pnpm add --save-dev nock @types/nock

Important : @types/nock contient les déclarations de types pour TypeScript. Si vous utilisez TypeScript 4.0+, les types peuvent déjà être intégrés dans la bibliothèque elle-même, mais pour des raisons de compatibilité, il est préférable de les installer explicitement.

3. Démarrage rapide

Écrivons un test minimal qui illustre le fonctionnement de base de nock. Supposons que nous ayons une fonction qui récupère les données d'un utilisateur depuis une API externe.

// userService.ts
import axios from 'axios';

export async function getUser(userId: number): Promise<{ id: number; name: string; email: string }> {
    const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${userId}`);
    return response.data;
}

Écrivons maintenant un test qui simule cette requête :

// userService.test.ts
import nock from 'nock';
import { getUser } from './userService';

describe('getUser', () => {
    afterEach(() => {
        nock.cleanAll(); // Nettoie tous les mocks après chaque test
    });

    it('doit retourner les données de l\'utilisateur', async () => {
        // 1. Configuration de l'interception
        const mockUser = { id: 1, name: 'John Doe', email: 'john@example.com' };
        nock('https://jsonplaceholder.typicode.com')
            .get('/users/1')
            .reply(200, mockUser);

        // 2. Appel de la fonction testée
        const user = await getUser(1);

        // 3. Vérification du résultat
        expect(user).toEqual(mockUser);
    });

    it('doit lever une erreur en cas de 500', async () => {
        nock('https://jsonplaceholder.typicode.com')
            .get('/users/1')
            .reply(500, { error: 'Erreur serveur' });

        await expect(getUser(1)).rejects.toThrow();
    });
});

Cet exemple montre à quel point il est facile de simuler une réponse serveur et de tester à la fois les scénarios de succès et d'erreur.

4. Bases

Recommendations