2015-09-30 23 views
10

の下で失敗:モカウォッチングは、私は非常に単純な興亜アプリケーションを持っているNPM

私はこのようなモカとsupertestでテスト
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); 

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

私は、変更のための私のファイルを見て、正常に動作します。この

mocha -u bdd -R min -w 

よう-wフラグを使用します。私はファイルを変更し、テストは再実行され、すべて正常です。非常に不思議な

しかし、私はこのようなスクリプトとしての私のpackage.jsonファイルの中にそのコマンドを移動した場合:

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

私が選んさ変更を行う、私はそれが動作コマンドを最初に実行したときに、まで今テストが失敗すると:私はmochaを停止して再起動するまで、エラーがなくならない

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) 

npmで実行すると、動作が異なるのはなぜですか? これを解決するにはどうすればよいですか?

答えて

10

Ok - 私は解決策を見つけました。これは、テストの際に私がアプリを2回起動していることと関係しています。両方を閉じないでください。

Supertestでテストを開始するには、var request = require("supertest").agent(app.listen());のようなリクエストを作成します。 Btw app.listen()は、私たちがアプリケーションで行ったのと同じことです。

私たちはファイルの変更を監視しているので、サーバーは決して近づくことはありません。次のテストの実行では、それは再び開始されます:var request = require("supertest").agent(app.listen());と「アドレスが使用中です」。

解決策は簡単です。テスト中でないときにリスニングを開始するだけです。簡単な方法は、アプリケーションのモジュールの親を確認することです:

if(!module.parent) { 
    app.listen(); 
} 
関連する問題