下午摩根看不起

我有一个非常简单的Koa应用程序:

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

我用这样的摩卡和超级特质来testing

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

我想看我的文件的变化,并使用这样的-w标志

 mocha -u bdd -R min -w 

这工作正常。 我更换一个文件,testing重新执行,一切正常。

但是,非常奇怪的是,如果我将这个命令作为脚本移动到我的package.json文件中,如下所示:

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

我第一次运行它的命令,当我做了一个改变,但现在testing失败:

 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) 

这个错误不会消失,直到我停止mocha ,然后重新启动它。

为什么通过npm运行时performance不同呢? 我能做些什么来解决这个问题?

好的 – 我find了解决scheme。 这与我在testing时两次启动应用程序有关。 而不是两个都closures。

使用Supertest开始testing,你可以像下面这样构造一个请求: var request = require("supertest").agent(app.listen()); 。 顺便说一句, app.listen()与我们在应用程序中做的是一样的。

由于我们正在观看我们的文件进行更改,服务器永远不会closures。 在下次运行testing时,它会再次启动: var request = require("supertest").agent(app.listen()); 和“地址正在使用”。

解决scheme很简单:只要在没有运行的情况下开始监听。 一个简单的方法是通过检查应用程序中的父模块:

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