Мокко смотреть не удается

У меня очень простое приложение 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);

что я тестирую с моккой и суперэфир как это;

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

Это прекрасно работает. Я меняю файл, тест пересматривается, и все хорошо.

Но, очень странно, если я переведу эту команду в мой package.json файл как script, вот так:

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

В первый раз, когда я запускаю команду, она работает, когда я делаю внесенное изменение, но теперь сбой теста:

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? Что я могу сделать, чтобы исправить это?

Ответ 1

Хорошо - я нашел решение. Это связано с тем, что я запускаю приложение дважды, когда тестируется. И не закрывая оба.

Чтобы начать тестирование с помощью Supertest, вы создаете такой запрос: var request = require("supertest").agent(app.listen());. Btw app.listen() - это то же самое, что и в нашем приложении.

Поскольку мы смотрим наши файлы на изменения, сервер никогда не приближается. При следующем запуске теста он снова запускается: var request = require("supertest").agent(app.listen()); и "Адрес используется".

Решение прост: просто начните слушать, когда вы не работаете под тестом. Простой способ сделать это - проверить родительский модуль в своем приложении:

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