2013-10-08 37 views
1

我已經找到了一種方法來做到這一點,但我的直覺告訴我應該有一些更習慣性的做法。基本上,我不喜歡的是,我必須要求測試套件中的快速應用程序,這讓我想知道是否存在競賽狀況。另外,我想知道如果我在幾個這樣的文件中運行幾個測試套件會發生什麼。測試快速應用程序API的正確方法?

任何人都知道更清潔的解決方案?

我簡化應用程序如下:

app.js

app = module.exports = express() 
... 
http.createServer(app).listen(app.get('port'), function(){ 
    console.log('app listening'); 
}); 

test.js

var request = require('superagent'); 
var assert = require('assert'); 
var app = require('../app'); 
var port = app.get('port'); 
var rootUrl = 'localhost:'+port; 

    describe('API tests', function(){ 
     describe('/ (root url)', function(){ 

      it('should return a 200 statuscode', function(done){ 
       request.get(rootUrl).end(function(res){ 
        assert.equal(200, res.status); 
        done(); 
       }); 
      }); 
    ... 
+2

我使用了一個名爲supertest https://github.com/visionmedia/supertest的模塊,它對此很有效。 – Brett

+1

如果您在應用中對端口進行硬編碼,那麼如果您需要這種靈活性,則無需在測試中將其導入。您可以考慮使用某種配置框架(如易於使用['config'](https://npmjs.org/package/config)),您可以在應用程序和測試中使用它。 – robertklep

+0

謝謝@Brett,我隨你的建議去了,它對我的​​需求很好。 –

回答

2

摩卡讓我們通過使用啓動服務器一次任意數量的測試root Suite

You may also pick any file and add "root" level hooks, for example add beforeEach() outside of describe()s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root Suite with no name.

我們用它來一次啓動Express服務器(我們使用環境變量,使其運行在不同的端口比我們的開發服務器上):

before(function() { 
    process.env.NODE_ENV = 'test'; 
    require('../../app.js'); 
}); 

(我們並不需要這裏done()因爲require是同步的。)這樣,服務器就啓動一次,不管有多少個不同的測試文件包含這個根級before函數。

然後我們還可以使用下面讓我們可以保持開發者的服務器nodemon運行,同時運行測試:

if (process.env.NODE_ENV === 'test') { 
    port = process.env.PORT || 3500; // Used by Heroku and http on localhost 
    process.env.PORT = process.env.PORT || 4500; // Used by https on localhost 
    } 
    else { 
    port = process.env.PORT || 3000; // Used by Heroku and http on localhost 
    process.env.PORT = process.env.PORT || 4000; // Used by https on localhost 
    }