2012-11-01 49 views
8

我使用express.js創建了一個簡單的Web應用程序,並且想用jasmine-node進行測試。到目前爲止工作正常,但我的問題是,我必須手動啓動服務器,每次我可以運行我的測試。自動化Jasmine-Node和express.js

請問如何編寫一個spec-helper來運行服務器(使用另一個端口,然後是我的開發工具),僅用於測試,然後殺死它?

+0

你運行的是什麼版本的express? – srquinn

+0

我正在使用版本3.x(現在3.0.2)。 – optikfluffel

回答

16

這是我做的:

我有一個server.js文件我的節點項目的根目錄下建立節點內部應用程序lication服務器(與快遞)和出口2種方法:

exports.start = function(config, readyCallback) { 

    if(!this.server) { 

     this.server = app.listen(config.port, function() { 

      console.log('Server running on port %d in %s mode', config.port, app.settings.env); 

      // callback to call when the server is ready 
      if(readyCallback) { 
       readyCallback(); 
      } 
     }); 
    } 
}; 

exports.close = function() { 
    this.server.close(); 
}; 

app.js文件將在這一點很簡單:

var server = require('./server'); 
server.start({ port: 8000 }); 

所以文件/文件夾的基本結構會是以下:

src 
    app.js 
    server.js 

有了這種分離將允許你正常運行服務器

node src/app.js 

.. 和/或要求它從一個自定義節點腳本,這可能是一個節點腳本(或傑克/咕嚕/任何任務),執行你的測試是這樣的:

/** my-test-task.js */ 

// util that spawns a child process 
var spawn = require('child_process').spawn; 

// reference to our node application server 
var server = require('./path/to/server.js'); 

// starts the server 
server.start({ port: 8000 }, function() { 

    // on server ready launch the jasmine-node process with your test file 
    var jasmineNode = spawn('jasmine-node', [ '.path/to/test/file.js' ]); 

    // logs process stdout/stderr to the console 
    function logToConsole(data) { 
     console.log(String(data)); 
    } 
    jasmineNode.stdout.on('data', logToConsole); 
    jasmineNode.stderr.on('data', logToConsole); 

    jasmineNode.on('exit', function(exitCode) { 
     // when jasmine-node is done, shuts down the application server 
     server.close(); 
    } 
}); 
+0

好吧,我知道了。如果你現在告訴我如何擺脫服務器輸出(例如:_GET/200 46ms - 167_)在我的測試輸出所有東西:) – optikfluffel

+0

好像你有你的節點服務器應用程序配置記錄請求,用於表達的Profiler中間件可能是?檢查您的快遞服務器代碼;) – BFil

+0

對不起,發現一個被遺忘的app.use(express.logger('dev'));謝謝^^ – optikfluffel

0

我使用摩卡 - 這是該死的類似 - 但同樣的原則應該適用:您可以嘗試requireapp.js文件在主要describe內的'beforeEach'鉤子文件。這應該爲你啓動。

+0

好了,然後啓動並且測試正在運行,但是如果我使用--autotest選項(或類似),它不會停止並失敗,如果我只想運行一次測試,它不會停止。最重要的是,我現在在我的測試輸出中有了http輸出(GET/200 6ms - 167)。我如何擺脫這一點? – optikfluffel

+0

你有這樣的例子嗎? – chovy

+0

下面是一個輸出示例:http://pastebin.com/9qF1NeU1 以及server_spec.coffee:http:// pastebin。com/uvcBuTiy – optikfluffel

0

假設你使用一些代碼,調用在server.js app.listen(),不需要在每次運行該文件,但只有一次,然後有兩個功能,如

startServer = -> app.listen(3000) 
stopServer = -> app.close() 

然後你就可以在beforeEach使用這些和afterEach

+0

沒有得到它的工作,來自@ShadowCloud的片段很好:) – optikfluffel

-1

如果你想要然後走一步在自動化您的測試,而你開發,你可以去你的終端線路,並執行

jasmine-node . --autotest 

茉莉花然後將保持列表引用到項目中的每個文件,並且每當你修改一個文件時,它都會告訴你這段代碼是否會破壞你的任何測試;)