Sinon pour JavaScript (Node.js) : guide complet avec exemples
1. Qu'est-ce que Sinon et pourquoi l'utiliser
Sinon.js est une bibliothèque JavaScript puissante qui fournit des doubles de test autonomes : des espions (spies), des stubs (stubs) et des mocks (mocks). Elle est indépendante de tout framework de test spécifique (Mocha, Jest, Jasmine, etc.) et peut être utilisée avec n'importe lequel d'entre eux. L'objectif principal de Sinon est d'isoler le code testé des dépendances externes (base de données, API, système de fichiers, temporisateurs), permettant de vérifier le comportement des fonctions dans un environnement contrôlé.
Pourquoi en avez-vous besoin ? Dans les applications réelles, les fonctions appellent souvent d'autres fonctions, accèdent à des services externes ou gèrent des opérations asynchrones. Sans Sinon, il est difficile de vérifier si une fonction de rappel a été appelée, avec quels arguments, combien de fois, ou de simuler une réponse serveur. Sinon résout ces problèmes de manière élégante et concise, rendant les tests rapides, fiables et prévisibles.
Cette bibliothèque est particulièrement populaire dans l'écosystème Node.js, où les tests unitaires sont essentiels. Elle permet de tester des fonctions sans lancer de véritables requêtes HTTP, sans accéder à la base de données et sans attendre les temporisateurs. Cela accélère l'exécution des tests des dizaines de fois et les rend déterministes.
2. Installation
Sinon s'installe via npm. Pour Node.js, exécutez la commande :
npm install sinon --save-dev
Si vous utilisez TypeScript, installez également les types :
npm install sinon @types/sinon --save-dev
Pour une utilisation dans le navigateur, vous pouvez inclure la version CDN :
<script src="https://cdn.jsdelivr.net/npm/sinon@latest/pkg/sinon.js"></script>
Après l'installation, importez la bibliothèque dans votre fichier de test :
const sinon = require('sinon'); // CommonJS
// ou
import sinon from 'sinon'; // ES Modules
3. Démarrage rapide — exemple minimal fonctionnel
Prenons un exemple simple : une fonction qui appelle un callback avec un message de bienvenue. Nous voulons vérifier que le callback a été appelé avec le bon argument.
const sinon = require('sinon');
// Fonction que nous testons
function greet(name, callback) {
callback(`Bonjour, ${name} !`);
}
// Test avec un espion (spy)
const callbackSpy = sinon.spy();
greet('Alice', callbackSpy);
console.log(callbackSpy.calledOnce); // true
console.log(callbackSpy.calledWith('Bonjour, Alice !')); // true
Cet exemple illustre l'idée de base : nous créons un espion, le passons à la fonction testée, puis vérifions comment il a été appelé. Dans les tests réels, vous utiliserez des assertions de votre framework de test.
4. Méthodes/fonctions/classes principales
4.1. sinon.spy() — Espion
Signature : sinon.spy([object], [method]) ou sinon.spy([func])
Fonctionnement : Crée un espion qui enregistre les informations sur les appels de fonction : nombre d'appels, arguments, contexte, valeur de retour. Peut envelopper une fonction existante ou remplacer une méthode d'objet.
Exemple :
const user = {
setName: function(name) { this.name = name; }
};
const spy = sinon.spy(user, 'setName');
user.setName('Jean');
console.log(spy.calledOnce); // true
console.log(spy.calledWith('Jean')); // true
console.log(spy.firstCall.args); // ['Jean']
spy.restore(); // obligatoire pour restaurer la méthode originale
4.2. sinon.stub() — Stub (bouchon)
Signature : sinon.stub([object], [method])
Fonctionnement : Crée un bouchon qui remplace une fonction et permet de prédéfinir son comportement : retour
Aussi dans la bibliothèque
Diesel pour Rust : guide complet avec exemples
Génération de rapports PDF en Swift : PDFKit et UIPrintPageRenderer
Typegoose pour TypeScript : guide complet avec exemples
Travailler avec les archives ZIP en PHP : guide complet sur ZipArchive
Travail avec les images en Swift : redimensionnement, recadrage (iOS/macOS)