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
Aussi dans la bibliothèque
Travailler avec YAML en C++ : bibliothèques yaml-cpp et rapidyaml
Cryptographie en TypeScript : Aperçu de la bibliothèque crypto-js
Guzzle pour PHP : guide complet avec exemples
Client OAuth pour Go (Golang) : Connexion aux fournisseurs OAuth 2.0
Bibliothèque GraphQL pour Go (Golang) — guide complet