1

我有一个 server.js 模块,它导出一个 start() 函数来启动我的服务器。我需要这个模块并从 index.js 启动服务器。

我正在尝试通过在 child_process.fork 调用中启动服务器来单独(使用 Mocha)对 server.js 模块进行单元测试,但我看不到如何调用导出的启动函数。

它目前通过将 'index.js' 传递给 fork 调用来工作,但是我看不到如何将选项传递给 server.js 模块(例如发送端口号)。

这是我的server.js和使用 index.js 的单元测试(只需要并调用 server.start())。

我想直接测试 server.js 以便我可以将环境变量传递给它。

====编辑====

我不确定我认为通过在单独的进程中启动服务器会获得什么。
我已将测试更改为仅在 before 块中启动服务器。
欢迎提出建议。

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

});
4

1 回答 1

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.

于 2013-01-08T15:13:28.480 回答