Wenn Sie die Funktion testen möchten, die koa-router routet, dann führen Sie einfach einen Komponententest für diese Funktion durch und lassen Sie das Routing nicht mehr ausführen.
Für mich klingt es wie Sie haben eine Datei wie app.js und es enthält Ihren gesamten Code. Sie können eine Datei "router.js" erstellen, um Routenbindungen und eine Datei "services.js" zu erstellen, in die Sie Ihre Anwendungslogik einfügen können.
So zum Beispiel app.js aussehen könnte:
var koa = require("koa");
var app = module.exports = koa();
var router = require('./router.js');
app.use(router.unsecured.middleware());
app.listen(3000);
Und router.js könnte wie folgt aussehen:
var router = require("koa-router");
var service = require("./services.js");
var unsecured = module.exports.unsecured = new router();
unsecured.post('/account/signin', service.signinUser);
unsecured.post('/account/register', service.registerUser);
Und services.js könnte wie folgt aussehen:
module.exports.signinUser = function*(signinDetails) {
// contains your application signin logic
};
module.exports.registerUser = function*(registerDetails) {
// contains your application register logic
};
So können Sie services.js individuell testen. Ich sehe keinen Wert darin, router.js einzeln zu testen, da es so trivial ist. Wie @Dan Pantry zeigt, können Sie das Routing als Teil eines Integrationstests mit Supertest testen.
Edit:
Das ist also ein wenig experimenteller Test, mit dem ich spiele um zu testen, ob das Routing korrekt ist. Ich verwende Mocha als Test-Runner und das Code-Beispiel, das ich in meinem ursprünglichen Code gepostet habe.
// standard library
var assert = require("assert");
// in app objects
var router = require('./router.js');
var service = require('./service.js');
describe("routing tests", function() {
it("test register routing, POST", function*(done) {
// arrange
var unsecured = router.unsecured;
var path = '/account/register';
var httpMethod = 'POST';
var expected = service.register.toString();
var actual;
// act
for (var i = 0; i < unsecured.stack.length; i++)
{
var pathMatch = unsecured.stack[i].path === path;
var methodMatch = unsecured.stack[i].methods.indexOf(httpMethod) >= 0;
if (pathMatch && methodMatch)
{
actual = unsecured.stack[i].middleware.toString();
break;
}
}
// assert
try {
assert.equal(expected, actual);
done();
} catch(err) {
done(err);
}
});
});
Es ist wahrscheinlich eine ordentliche Art und Weise, dies zu tun (und eine modulare Art und Weise für mehrere Pfade zu testen), aber wie gesagt das ist nur ein einfaches Beispiel das Routing zu überprüfen, ob den korrekten Kundendienst anrufen. Was ich mache, ist in das Koa-Router-Objekt zu untersuchen, um zu überprüfen, welcher Pfad abhängig von der HTTP-Methode (z. B. POST, GET usw.) an welchen Dienstcode gebunden ist.
Wenn Sie Ihr Routing und Ihre Dienste in Modulen haben, vermeidet dieser Test vollständig den Umgang mit der Haupt-Koa-App. Obwohl dieser Test technisch gesehen mehrere Einheiten (das Routing und den Service-Code) umfasst, wäre es technisch gesehen ein Integrationstest, aber das bedeutet, dass Sie nicht in die Nähe von app.listen()
gehen, was Sie in Ihren Tests nicht nennen wollten.
Testen gegen die App selbst ist ein Integrationstest. Möchten Sie die App selbst (Integration) oder einzelne Middleware (Komponententests) testen? –
NR. Ich teste das Interface (Vertrag) meiner API. Ich setze RESTful-Endpunkte durch Koa frei. Das heißt, ich TDD diese Endpunkte und so meine TDD, die NON-Integration ist .. sie sind Unit-Tests sollten nicht über app.Listen() testen.Ich prüfe den tatsächlichen CODE, den SUT, den ich Koa's Rahmen nicht prüfe. Sie verwenden ein Framework, aber Sie testen die Domänenlogik oder was auch immer. Meine Domänenlogik enthält die Routen. Denn wenn ein Entwickler eine Route bricht, hat er gerade einen BDD-Test abgebrochen und eine Geschäftsanforderung gebrochen. So entwickle ich Code. – PositiveGuy
Sie erhalten hier eine Terminologie. Wenn Sie Ihre Routen testen, also "GET /" testen, müssen Sie diesen Teil Ihrer Anwendung unbedingt als Ganzes testen - was einen Integrationstest darstellt. Wenn Sie einzelne Funktionen testen (was Sie nicht sind), führen Sie Unit-Tests durch. Sie wollen nicht die Ebene testen, die Ihre Anwendung mit koa verbindet (was sehr dünn sein sollte, btw), Sie wollen nur den Integrationstest dieses Bit. –