在npm下摩卡观看失败

Mar*_*erg 13 mocha.js node.js npm supertest koa

我有一个非常简单的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);
Run Code Online (Sandbox Code Playgroud)

我用这样的mocha和supertest测试;

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

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

mocha -u bdd -R min -w
Run Code Online (Sandbox Code Playgroud)

这很好.我更改了一个文件,重新测试了测试,一切都很顺利.

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

"scripts": {
    "watch:test": "mocha -u bdd -R min -w"
},
Run Code Online (Sandbox Code Playgroud)

我第一次运行它运行的命令,当我做出一个被拾取的更改,但现在测试失败了:

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)
Run Code Online (Sandbox Code Playgroud)

在我停止mocha然后重新启动之前,该错误不会消失.

为什么它在运行时表现不同npm?我该怎么做才能解决这个问题?

Mar*_*erg 19

好的 - 我找到了解决方案.这与我在测试时两次启动应用程序有关.而不是两个都关闭.

要开始使用Supertest进行测试,您需要构建一个这样的请求:var request = require("supertest").agent(app.listen());.顺便说一句,app.listen()这和我们在申请中的做法是一样的.

由于我们正在观察我们的文件以进行更改,因此服 在下一次测试时,它再次启动:var request = require("supertest").agent(app.listen());并且"地址正在使用中".

解决方案很简单:只是在未运行测试时开始聆听.一种简单的方法是在应用程序中检查模块父级:

if(!module.parent) {
   app.listen();
}
Run Code Online (Sandbox Code Playgroud)