2015-07-16 9 views
7

Ich weiß nicht, wie ich diesen "statischen Anruf an einen Koa-Router" nennen könnte. Scheint das die richtige Wortwahl für das, was ich wirklich erreichen möchte, wenn Sie technisch darüber sprechen würden?So rufen Sie die Koa.js-App-Instanz für Komponententests an

Wie auch immer, ich verwende koa-router und ich bin Einheitstests (nicht Integration Tests). Also möchte ich aus diesem Grund nicht .listen() auf meiner Koa-App aufrufen ... es würde einen http-Server erzeugen, der meinen Test jetzt zu einem Integrationstest macht.

Stattdessen möchte ich einfach einen direkten Aufruf an die App-Objektinstanz richten und eine Route aufrufen und keine Ergebnisse zurückgeben und überprüfen, dass ich keine Ergebnisse in der Antwort zurückgegeben habe.

Wie können Sie das tun? Ich kann kein Beispiel finden und habe alle Arten von Pseudo-Code-Versuchen gegen das Koa-App-Objekt versucht.

+0

Testen gegen die App selbst ist ein Integrationstest. Möchten Sie die App selbst (Integration) oder einzelne Middleware (Komponententests) testen? –

+0

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

+1

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. –

Antwort

4

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.

+0

ja das ist wie ich es schon getrennt habe ... aber du hast deine app.listen in app.js also das ist ein riesiger unterschied, gute sachen. – PositiveGuy

+0

Der Grund für das Testen des Routers ist, weil einige dumme Programmierer es aufmachen könnten. Sie könnten eine Route entfernen, sie könnten sich mit der js anlegen und wir enden mit einem Null-Router, alle möglichen Dinge, also denke ich, dass das Testen dieser Einheit wichtig ist. – PositiveGuy

+0

Überprüfen Sie meine Bearbeitung auf einen möglichen Ansatz, um das zu vermeiden, worüber Sie sich Sorgen machen, und gleichzeitig den Supertest-Ansatz zu vermeiden. –

Verwandte Themen