Ich bin gerade dabei, Node.js zu lernen und habe mit Express herumgespielt . Ich mag das Framework wirklich, aber ich habe Probleme herauszufinden, wie man einen Einheits- / Integrationstest für eine Route schreibt.
Es ist einfach, einfache Module zu testen, und das mit Mocha . Meine Komponententests mit Express schlagen jedoch fehl, da das von mir übergebene Antwortobjekt die Werte nicht beibehält.
Zu testende Routenfunktion (route / index.js):
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
Unit Test Modul:
var should = require("should")
, routes = require("../routes");
var request = {};
var response = {
viewName: ""
, data : {}
, render: function(view, viewData) {
viewName = view;
data = viewData;
}
};
describe("Routing", function(){
describe("Default Route", function(){
it("should provide the a title and the index view name", function(){
routes.index(request, response);
response.viewName.should.equal("index");
});
});
});
Wenn ich dies ausführe, schlägt es fehl für "Fehler: Globale Lecks erkannt: Ansichtsname, Daten".
Wo mache ich etwas falsch, damit das funktioniert?
Gibt es eine bessere Möglichkeit für mich, meinen Code auf dieser Ebene zu testen?
Update 1. Code-Snippet korrigiert, da ich "it ()" ursprünglich vergessen habe.
Wie andere in Kommentaren empfohlen haben, sieht es so aus, als ob der kanonische Weg zum Testen von Express-Controllern der Supertest ist .
Ein Beispieltest könnte folgendermaßen aussehen:
Vorteil: Sie können Ihren gesamten Stack auf einmal testen.
Nachteil: Es fühlt sich an und verhält sich ein bisschen wie Integrationstests.
quelle
integration
, und vielleicht sollten Testrouten Integrationstests überlassen werden. Ich meine, die Funktionalität von Routen, die mit ihren definierten Rückrufen übereinstimmen, wird vermutlich bereits von express.js getestet. Jede interne Logik zum Erhalten des Endergebnisses einer Route sollte idealerweise außerhalb dieser Route modularisiert werden, und diese Module sollten Unit-getestet werden. Ihre Interaktion, dh die Route, sollte integrationsgeprüft werden. Würdest du zustimmen?Ich bin zu dem Schluss gekommen, dass der einzige Weg, um Express-Anwendungen wirklich zu testen, darin besteht, eine große Trennung zwischen den Anforderungshandlern und Ihrer Kernlogik aufrechtzuerhalten.
Daher sollte sich Ihre Anwendungslogik in separaten Modulen befinden, die
require
getestet und einheitlich getestet werden können, und eine minimale Abhängigkeit von den Express-Anforderungs- und Antwortklassen als solchen aufweisen.Dann müssen Sie in den Anforderungshandlern die entsprechenden Methoden Ihrer Kernlogikklassen aufrufen.
Ich werde ein Beispiel aufstellen, sobald ich meine aktuelle App umstrukturiert habe!
Ich denke so etwas ? (Fühlen Sie sich frei, das Wesentliche oder den Kommentar zu teilen, ich untersuche dies immer noch).
Bearbeiten
Hier ist ein kleines Beispiel, Inline. Ein detaillierteres Beispiel finden Sie in der Übersicht .
quelle
Der einfachste Weg, HTTP mit Express zu testen, besteht darin, den http-Helfer von TJ zu stehlen
Ich persönlich benutze seinen Helfer
Wenn Sie Ihr Routenobjekt speziell testen möchten, übergeben Sie die richtigen Mocks
quelle
Wenn Unit-Tests mit Express 4 durchgeführt werden, beachten Sie dieses Beispiel von Gjohnson :
quelle
Ich habe mich auch gefragt, aber speziell für Unit-Tests und nicht für Integrationstests. Das mache ich gerade,
Wo der RouterObj gerade ist
{router: expressRouter, path: '/api'}
. Ich lade dann Subrouter mit einvar loginRouterInfo = require('./login')(express.Router({mergeParams: true}));
und dann ruft die Express-App eine Init-Funktion auf, die den Express-Router als Parameter verwendet. Der initRouter ruft dannrouter.use(loginRouterInfo.path, loginRouterInfo.router);
auf, um den Subrouter zu mounten.Der Subrouter kann getestet werden mit:
quelle
Um Unit-Tests anstelle von Integrationstests zu erreichen, habe ich das Antwortobjekt des Request-Handlers verspottet.
Um dann Integrationstests durchzuführen, können Sie Ihren EndpointHandler verspotten und den Endpunkt mit Supertest aufrufen .
quelle
In meinem Fall wollte ich nur testen, ob der richtige Handler aufgerufen wurde. Ich wollte den Supertest verwenden, um die Einfachheit der Anforderungen an die Routing-Middleware zu verdeutlichen. Ich verwende Typescript a und dies ist die Lösung, die für mich funktioniert hat
Die Routen
Die Tests
Ich hatte einige Probleme, um die Verspottung zum Laufen zu bringen. Aber mit jest.doMock und der spezifischen Reihenfolge, die Sie im Beispiel sehen, funktioniert es.
quelle