2015-09-30 11 views
10

तहत विफल रहता है मैं एक बहुत ही सरल कोआ आवेदन किया है:मोचा देख 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); 

कि मैं मोचा और इस तरह 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); 
    }); 
}); 

मैं बदलाव के लिए अपनी फ़ाइलें देख सकते हैं और इस

mocha -u bdd -R min -w 

कि ठीक काम करता है की तरह -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

ठीक है - मुझे समाधान मिला। इसके साथ ऐसा करना है कि परीक्षण के दौरान, मैं दो बार एक ऐप शुरू कर रहा हूं। और दोनों बंद नहीं।

सुपरटेस्ट के साथ परीक्षण शुरू करने के लिए आप इस तरह के अनुरोध का निर्माण करते हैं: var request = require("supertest").agent(app.listen());। बीटीडब्ल्यू app.listen() वही बात है जो हम अपने आवेदन में करते हैं।

चूंकि हम परिवर्तनों के लिए हमारी फाइलें देख रहे हैं, सर्वर कभी भी बंद नहीं होता है। परीक्षण के अगले भाग पर यह फिर से शुरू होता है: var request = require("supertest").agent(app.listen()); और "पता उपयोग में है"।

समाधान सरल है: जब आप परीक्षण के तहत नहीं चल रहे हैं तो बस सुनना शुरू करें। ऐसा करने का एक आसान तरीका आपके आवेदन में मॉड्यूल पेरेंट की जांच करके है:

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