2015-09-30 20 views
10

Tôi có một ứng dụng Koa rất đơn giản:mocha ngắm thất bại dưới NPM

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

mà tôi thử nghiệm với mocha và supertest như thế này;

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

tôi muốn xem các tập tin của tôi đối với những thay đổi và sử dụng -w cờ như thế này

mocha -u bdd -R min -w 

đó làm việc tốt. Tôi thay đổi một tập tin, thử nghiệm được reexcuted và tất cả là tốt.

Nhưng, rất kỳ lạ, nếu tôi chuyển lệnh đó vào tập tin package.json của tôi như là một kịch bản, như thế này:

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

Lần đầu tiên tôi chạy lệnh nó hoạt động, khi tôi thực hiện một sự thay đổi đó được chọn nhưng giờ thử nghiệm không thành công với:

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) 

Lỗi đó sẽ không biến mất cho đến khi tôi dừng mocha và sau đó khởi động lại.

Tại sao nó hoạt động khác khi chạy qua npm? Tôi có thể làm gì để sửa lỗi này?

Trả lời

10

Ok - Tôi đã tìm thấy giải pháp. Điều này liên quan đến việc tôi bắt đầu một ứng dụng hai lần, khi được kiểm tra. Và không đóng cả hai.

Để bắt đầu thử nghiệm với Supertest bạn xây dựng một yêu cầu như thế này: var request = require("supertest").agent(app.listen());. Btw các app.listen() là điều tương tự như chúng tôi làm trong ứng dụng của chúng tôi.

Vì chúng tôi đang xem các tệp của chúng tôi để thay đổi máy chủ không bao giờ gần gũi. Trong lần chạy thử tiếp theo, nó bắt đầu lại: var request = require("supertest").agent(app.listen()); và "Địa chỉ đang được sử dụng".

Giải pháp rất đơn giản: chỉ cần bắt đầu nghe khi bạn không chạy thử. Cách đơn giản để làm điều đó là kiểm tra một phụ huynh học phần trong ứng dụng của bạn:

if(!module.parent) { 
    app.listen(); 
} 
Các vấn đề liên quan