2015-09-30 9 views
10

ich eine sehr einfache Anwendung Koa haben:Mokka Beobachtung nicht unter npm

var app = module.exports = require("koa")(); 

app.use(function *(){ 
    this.body = "Koa says Hi!"; 
}); 

var port = process.env.PORT || (process.argv[2] || 3000); 
port = (typeof port === "number") ? port : 3000; 

app.listen(port); 
console.log("Application started. Listening on port:" + port); 

, die ich mit Mokka und Supertest wie dies zu testen;

var app = require("../"); 
var request = require("supertest").agent(app.listen()); 

describe("Our amazing site", function() { 

    it("has a nice welcoming message", function (done) { 
     request 
      .get("/") 
      .expect("Koa says Hi!") 
      .end(done); 
    }); 
}); 

Ich möchte meine Dateien für Änderungen beobachten und die -w Flagge wie diese

mocha -u bdd -R min -w 

verwenden, das gut funktioniert. Ich ändere eine Datei, der Test wird erneut ausgeführt und alles ist gut.

aber sehr seltsam, wenn ich diesen Befehl in meine package.json Datei als Skript zu bewegen, wie folgt aus:

"scripts": { 
    "watch:test": "mocha -u bdd -R min -w" 
}, 

Das erste Mal, dass ich den Befehl funktioniert es laufen, wenn ich eine Änderung vornehmen, die gerichtet bis jetzt aber der Test nicht bestanden mit:

1) Uncaught error outside test suite: 
    Uncaught Error: listen EADDRINUSE :::3000 
     at Object.exports._errnoException (util.js:837:11) 
     at exports._exceptionWithHostPort (util.js:860:20) 
     at Server._listen2 (net.js:1231:14) 
     at listen (net.js:1267:10) 
     at Server.listen (net.js:1363:5) 
     at Application.app.listen (node_modules/koa/lib/application.js:70:24) 
     at Object.<anonymous> (index.js:10:5) 
     at Object.<anonymous> (test/site.spec.js:1:73) 
     at Array.forEach (native) 
     at StatWatcher._handle.onchange (fs.js:1285:10) 

Dieser Fehler wird nicht weggehen, bis ich mocha stoppen und dann neu starten.

Warum verhält es sich bei der Ausführung über npm anders? Was kann ich tun, um das Problem zu beheben?

Antwort

10

Ok - Ich habe die Lösung gefunden. Das hat damit zu tun, dass ich im Test eine App zweimal starte. Und nicht beide schließen.

Um mit Supertest zu testen, erstellen Sie eine Anfrage wie diese: var request = require("supertest").agent(app.listen());. Btw der app.listen() ist das gleiche wie wir in unserer Anwendung tun.

Da wir unsere Dateien auf Änderungen beobachten, kommt der Server nie zu nahe. Beim nächsten Testlauf beginnt es erneut: var request = require("supertest").agent(app.listen()); und die "Adresse wird verwendet".

Die Lösung ist einfach: Starten Sie einfach zuhören, wenn Sie nicht im Test laufen. Eine einfache Methode dafür besteht darin, in Ihrer Anwendung nach einem übergeordneten Modul zu suchen:

if(!module.parent) { 
    app.listen(); 
}