我有一个server.js模块,它导出一个start()函数来启动我的服务器。 我需要这个模块并从index.js启动服务器。
我试图通过在child_process.fork调用中启动服务器来单独测试server.js模块(使用Mocha),但我没有看到如何调用导出的启动函数。
它目前正在通过将'index.js'传递给fork调用,但后来我没有看到如何将选项传递给server.js模块(例如发送端口号)。
这是我的server.js和使用index.js的unit test(只需要并调用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 :(得分: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
中。