Wie würde ich die Datenbank in meiner Anwendung node.js verspotten, die in diesem Fall mongodb
als Backend für eine Blog-REST-API verwendet wird?
Sicher, ich könnte die Datenbank auf eine bestimmte Datenbank testing
einstellen, aber ich würde trotzdem Daten speichern und nicht nur meinen Code, sondern auch die Datenbank testen, also mache ich eigentlich keine Unit-Tests, sondern Integrationstests.
Was soll man also tun? Erstellen Sie Datenbank-Wrapper als mittlere Ebene zwischen Anwendung und Datenbank und ersetzen Sie die DAL beim Testen?
// app.js
var express = require('express');
app = express(),
mongo = require('mongoskin'),
db = mongo.db('localhost:27017/test?auto_reconnect');
app.get('/posts/:slug', function(req, res){
db.collection('posts').findOne({slug: req.params.slug}, function (err, post) {
res.send(JSON.stringify(post), 200);
});
});
app.listen(3000);
// test.js
r = require('requestah')(3000);
describe("Does some testing", function() {
it("Fetches a blogpost by slug", function(done) {
r.get("/posts/aslug", function(res) {
expect(res.statusCode).to.equal(200);
expect(JSON.parse(res.body)["title"]).to.not.equal(null);
return done();
});
});
));
Es gibt eine allgemeine Faustregel, wenn es um das Verspotten geht
Verspotten Sie nichts, was Sie nicht besitzen.
Wenn Sie die Datenbank verspotten möchten, verstecken Sie sie in einer abstrahierten Service-Schicht und verspotten Sie diese Schicht. Stellen Sie dann sicher, dass Sie die Integration der tatsächlichen Service-Schicht testen.
Persönlich habe ich mich von der Verwendung von Mocks zum Testen verabschiedet und sie für das Design von oben nach unten verwendet, um die Entwicklung von oben nach unten voranzutreiben und dabei die Service-Layer zu verspotten und schließlich diese Layer zu implementieren und Integrationstests zu schreiben. Als Testwerkzeug verwendet, neigen sie dazu, Ihren Test sehr spröde zu machen und führen im schlimmsten Fall zu einer Abweichung zwischen tatsächlichem Verhalten und verspottetem Verhalten.
quelle
Ich bin mit der ausgewählten Antwort oder anderen Antworten bisher nicht einverstanden.
Wäre es nicht großartig, wenn Sie Fehler abfangen könnten, die durch die chaotischen und oft chaotischen Änderungen an DB-Schemas und Ihrem Code hervorgerufen wurden, BEVOR es zur Qualitätssicherung kommt? Ich wette, die Mehrheit würde zum Teufel ja schreien!
Sie können und sollten Ihre DB-Schemas mit Sicherheit isolieren und testen. Und Sie tun dies nicht basierend auf einem Emulator oder einem umfangreichen Image oder einer Neuerstellung Ihrer Datenbank und Ihres Computers. Dies ist nur ein Beispiel für SQLite. Sie verspotten es basierend auf einer im Speicher ausgeführten Instanz, die ausgeführt wird, und mit statischen Daten, die sich in der in der Speicherinstanz nicht ändern. Dies bedeutet, dass Sie Ihre Datenbank wirklich isoliert testen und Ihren Tests auch vertrauen können. Und offensichtlich ist es schnell, weil es sich im Speicher befindet, ein Skelett, und am Ende eines Testlaufs verschrottet wird.
Ja, Sie sollten und Sie sollten das SCHEMA testen, das in eine sehr kompakte Speicherinstanz der von Ihnen verwendeten DB-Engine / Laufzeit exportiert wird, und das zusammen mit dem Hinzufügen einer sehr kleinen Menge statischer Daten zu Ihrer isolierten verspotteten DB wird.
Sie exportieren Ihre realen Schemas regelmäßig (automatisiert) aus Ihrer realen Datenbank und importieren / aktualisieren diese in Ihre Light-in-Memory-DB-Instanz vor jedem Push an die Qualitätssicherung. Sie werden sofort wissen, ob die neuesten DB-Änderungen von Ihren DB-Administratoren oder anderen vorgenommen wurden Entwickler, die das Schema in letzter Zeit geändert haben, haben alle Tests abgebrochen.
Obwohl ich die Bemühungen begrüße, Ihr Bestes zu geben, um zu antworten, würde ich die aktuelle Antwort ablehnen, wenn ich könnte, aber ich bin neu und habe noch nicht genug Ruf aufgebaut, um meine Fähigkeit dazu zu ermöglichen.
Was die Person betrifft, die mit "Verspotten Sie nichts, was Sie nicht besitzen" geantwortet hat. Ich denke, er wollte sagen "Teste nichts, was du nicht besitzt". Aber du verspottest Dinge, die du nicht besitzt! Denn das sind die Dinge, die nicht getestet werden und die isoliert werden müssen!
Ich habe vor, das WIE mit Ihnen zu teilen und werde diesen Beitrag zu einem späteren Zeitpunkt mit echtem Beispiel-JS-Code aktualisieren!
Dies ist, was viele testgetriebene Teams ständig tun. Man muss nur das Wie verstehen.
quelle
Mein bevorzugter Ansatz für Unit-Test-DB-Code in einer beliebigen Sprache ist der Zugriff auf Mongo über eine Repository-Abstraktion (ein Beispiel finden Sie hier http://iainjmitchell.com/blog/?p=884 ). Die Implementierungen variieren in Bezug auf die DB-spezifischen Funktionen. Wenn Sie jedoch den gesamten Mongo-Code aus Ihrer eigenen Logik entfernen, können Sie Unit Test durchführen. Ersetzen Sie einfach die Mongo Repository-Implementierung durch eine abgespeckte Version, die trivial einfach ist. Speichern Sie beispielsweise Objekte einfach in einer einfachen In-Memory-Wörterbuchsammlung.
Auf diese Weise erhalten Sie die Vorteile eines Unit-Tests Ihres eigenen Codes ohne DB-Abhängigkeiten. Sie müssen jedoch weiterhin Integrationstests für die Haupt-DB durchführen, da Sie die Eigenheiten der realen Datenbank wahrscheinlich nie so emulieren können wie andere sagte hier. Die Art von Dingen, die ich gefunden habe, ist so einfach wie das Indizieren im abgesicherten Modus oder ohne abgesicherten Modus. Insbesondere wenn Sie einen eindeutigen Index haben, kann Ihre Dummy-Speicherimplementierung dies in allen Fällen berücksichtigen, Mongo jedoch nicht ohne abgesicherten Modus.
Während Sie für einige Vorgänge noch Tests mit der Datenbank durchführen müssen, können Sie Ihre eigene Logik mit einer ausgeblendeten Repository-Implementierung auf jeden Fall ordnungsgemäß testen.
quelle
Der Zweck des Verspottens besteht darin, den eigenen Code für Komplexität und Komponententest zu überspringen. Wenn Sie e2e-Tests schreiben möchten, verwenden Sie die Datenbank.
Das Schreiben von Code zum Einrichten / Herunterfahren einer Test-DB für Unit-Tests ist eine technische Schuld und unglaublich unbefriedigend.
Es gibt Scheinbibliotheken in npm:
mongo - https://www.npmjs.com/package/mongomock
Mungo - https://www.npmjs.com/package/mockgoose
Wenn diese die von Ihnen benötigten Funktionen nicht unterstützen, müssen Sie möglicherweise die reale Funktion verwenden.
quelle
Ich hatte dieses Dilemma und entschied mich, mit einer Test-DB zu arbeiten und sie jedes Mal zu reinigen, wenn der Test beginnt. (So lassen Sie alles fallen: https://stackoverflow.com/a/25639377/378594 )
Mit NPM können Sie sogar ein Testskript erstellen, das die Datenbankdatei erstellt und anschließend bereinigt.
quelle