2015-09-30 4 views
10

У меня есть очень простое приложение КОА:мокко наблюдения терпит неудачу под НПМ

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

, что я испытываю с мокко и 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); 
    }); 
}); 

Я хочу смотреть мои файлы для изменения и использовать -w флаг, как этот

mocha -u bdd -R min -w 

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

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

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

ответ

10

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

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

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

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

if(!module.parent) { 
    app.listen(); 
} 
Смежные вопросы