2015-09-30 27 views
10

ho una molto semplice applicazione Koa:moka osservazione fallisce sotto 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); 

che provo con la moka e Supertest come questo;

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); 
    }); 
}); 

voglio vedere i miei file per le modifiche e utilizzare il flag -w come questo

mocha -u bdd -R min -w 

che funziona bene. Cambio un file, il test viene rieseguito e tutto va bene.

Ma, molto strano, se mi trasferisco quel comando nel mio file package.json come uno script, come questo:

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

La prima volta che ho eseguito il comando funziona, quando faccio un cambiamento che viene prelevato up, ma ora il test fallisce con:

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) 

Tale errore non se ne andrà fino a quando mi fermo mocha e riavviarlo.

Perché si comporta diversamente quando viene eseguito tramite npm? Cosa posso fare per risolvere questo problema?

risposta

10

Ok, ho trovato la soluzione. Questo ha a che fare con il fatto che sto avviando un'app due volte, quando sono sotto test. E non chiudendo entrambi.

Per iniziare a testare con Supertest, si costruisce una richiesta come questa: var request = require("supertest").agent(app.listen());. A proposito di app.listen() è la stessa cosa che facciamo nella nostra applicazione.

Poiché stiamo guardando i nostri file per le modifiche, il server non si avvicina mai. Alla prossima esecuzione del test ricomincia: var request = require("supertest").agent(app.listen()); e "Indirizzo è in uso".

La soluzione è semplice: basta iniziare ad ascoltare quando non si sta eseguendo il test. Un modo semplice per farlo consiste nel cercare un genitore del modulo nella tua applicazione:

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