Sinon für JavaScript (Node.js): Komplettguide mit Beispielen
1. Was ist Sinon und warum braucht man es?
Sinon.js ist eine leistungsstarke Bibliothek für JavaScript, die eigenständige Test-Doubles bereitstellt: Spione (spies), Stubs (stubs) und Mocks (mocks). Sie ist unabhängig vom verwendeten Test-Framework (Mocha, Jest, Jasmine u.a.) und kann mit jedem davon kombiniert werden. Das Hauptziel von Sinon ist es, den zu testenden Code von externen Abhängigkeiten (Datenbanken, APIs, Dateisystem, Timer) zu isolieren, sodass das Verhalten von Funktionen in einer kontrollierten Umgebung geprüft werden kann.
Warum ist das wichtig? In echten Anwendungen rufen Funktionen oft andere Funktionen auf, greifen auf externe Dienste zu oder arbeiten mit asynchronen Operationen. Ohne Sinon können Sie nicht einfach überprüfen, ob eine Callback-Funktion aufgerufen wurde, mit welchen Argumenten, wie oft, oder eine Serverantwort simulieren. Sinon löst diese Probleme elegant und präzise, macht Tests schnell, zuverlässig und vorhersagbar.
Die Bibliothek ist besonders im Node.js-Ökosystem beliebt, wo Modultests entscheidend sind. Sie ermöglicht es, Funktionen zu testen, ohne echte HTTP-Anfragen zu senden, auf Datenbanken zuzugreifen oder auf Timer zu warten. Das beschleunigt die Testausführung um ein Vielfaches und macht sie deterministisch.
2. Installation
Sinon wird über npm installiert. Führen Sie für Node.js folgenden Befehl aus:
npm install sinon --save-dev
Wenn Sie TypeScript verwenden, installieren Sie auch die Typdefinitionen:
npm install sinon @types/sinon --save-dev
Für die Verwendung im Browser können Sie die CDN-Version einbinden:
<script src="https://cdn.jsdelivr.net/npm/sinon@latest/pkg/sinon.js"></script>
Nach der Installation importieren Sie die Bibliothek in Ihre Testdatei:
const sinon = require('sinon'); // CommonJS
// oder
import sinon from 'sinon'; // ES Modules
3. Schnellstart – Minimales Arbeitsbeispiel
Betrachten wir ein einfaches Beispiel: Eine Funktion, die einen Callback mit einer Begrüßung aufruft. Wir möchten prüfen, ob der Callback mit dem richtigen Argument aufgerufen wurde.
const sinon = require('sinon');
// Die zu testende Funktion
function greet(name, callback) {
callback(`Hallo, ${name}!`);
}
// Test mit einem Spion (spy)
const callbackSpy = sinon.spy();
greet('Alice', callbackSpy);
console.log(callbackSpy.calledOnce); // true
console.log(callbackSpy.calledWith('Hallo, Alice!')); // true
Dieses Beispiel zeigt die grundlegende Idee: Wir erstellen einen Spion, übergeben ihn an die zu testende Funktion und prüfen dann, wie er aufgerufen wurde. In echten Tests würden Sie Assertions aus Ihrem Test-Framework verwenden.
4. Wichtige Methoden/Funktionen/Klassen
4.1. sinon.spy() – Der Spion
Signatur: sinon.spy([object], [method]) oder sinon.spy([func])
Funktion: Erstellt einen Spion, der Informationen über Funktionsaufrufe aufzeichnet: Anzahl der Aufrufe, Argumente, Kontext, Rückgabewert. Er kann eine vorhandene Funktion umschließen oder eine Methode eines Objekts ersetzen.
Beispiel:
const user = {
setName: function(name) { this.name = name; }
};
const spy = sinon.spy(user, 'setName');
user.setName('John');
console.log(spy.calledOnce); // true
console.log(spy.calledWith('John')); // true
console.log(spy.firstCall.args); // ['John']
spy.restore(); // Originalmethode unbedingt wiederherstellen
4.2. sinon.stub() – Der Stub
Signatur: sinon.stub([object], [method])
Funktion: Erstellt einen Stub, der eine Funktion ersetzt und es ermöglicht, ihr Verhalten vorzugeben: Rückgab
Auch in der Bibliothek
Testen in JavaScript (Node.js): Frameworks und Werkzeuge
HTML-Parsing in Node.js: Top-Bibliotheken und Codebeispiele
Socket.io für JavaScript (Node.js): Vollständiger Leitfaden mit Beispielen