2013-01-06 48 views
1

我有一個server.js模塊,導出一個start()函數來啓動我的服務器。 我需要這個模塊並從index.js啓動服務器。Node.js調用函數child_process.fork

我想通過在child_process.fork調用中啓動服務器來單元測試server.js模塊(使用Mocha),但是我看不到如何調用導出的啓動函數。

它目前的工作是將'index.js'傳遞給fork調用,但後來我看不到如何將選項傳遞給server.js模塊(例如發送端口號)。

這裏是我的server.jsunit test,它使用index.js(它只需要調用server.start())。

我想直接測試server.js,因此我可以將環境變量傳遞給它。

==== ====編輯

我不知道什麼,我想我會在一個單獨的進程啓動服務器獲得。
我已經改變了測試,只是在前面的塊中啓動服務器。
建議歡迎。

var assert = require("assert"); 
var request = require("request"); 

describe("Server", function(){ 
    var server; 
    var port = 4008; 

    before(function(done){ 
    server = require("../server"); 
    server.start(port); 
    done(); 
    }); 

    it('listens on specified port (' + port + ')', function(done){ 
    request('http://localhost:' + port, function(err, res, body){ 
     assert(res.statusCode == 200); 
     done(); 
    }); 
    }); 

}); 
+0

如果你不需要爲你的測試產生進程,那麼這個問題應該可能因爲本地化而關閉。 – qubyte

回答

1

您可能要使用此cluster模塊,這使得處理過程簡單一些。以下內容可能與您需要的內容相符。

var cluster = require('cluster'); 

// Runs only on the master process. 
if (cluster.isMaster) { 
    var environmentVariables = { PORT: 2020 }; 

    var worker = cluster.fork(environmentVariables); 

    // Catch a message from the worker, and then destroy it. 
    worker.on('message', function(message) { 
     if (message.hasOwnProperty('testResult')) { 
      // Kill the worker. 
      worker.destroy(); 

      // Then do something with the result. 
     } 
    }); 
} 

// Runs only on a worker process. 
if (cluster.isWorker) { 
    var server = require('./server'); 

    server.start(); 

    // Do some stuff for tests. 

    // Send the test result. 
    process.send({ testResults: 'pass', failReason: null }); 
} 

我沒有測試過這一點,但希望要旨是明確的。您可以在生成工作進程時傳入自定義環境變量,然後將工作進程消息作爲主結果。您可能需要處理退出事件以及工人崩潰或掛起時的時間。

順便說一下,您應該將process.env.PORT包裝在parseInt中。

+0

如果我把所有的測試代碼粘貼在工作進程中,那看起來沒有什麼不同,只是把「var server = require('../ server'); server.start();」在摩卡的前塊。他們將在同一個過程中運行。我認爲這很好。我不確定爲什麼我想讓服務器保持獨立的進程。 – kjs3