在单元测试中关闭Node.js的http服务器

3
假设我有一些单元测试,用于测试Web服务器。由于我不想在这里讨论原因(超出范围;-),每个测试都需要一个新启动的服务器。
只要我不向服务器发送请求,一切都很好。但是一旦我这样做了,对http服务器的close函数的调用就不像预期的那样工作,因为所有已经发出的请求都会产生保持活动状态的连接,因此服务器会等待120秒才真正关闭。
当然,这对于运行测试来说是不可接受的。
目前,我唯一看到的解决方案是:
  • 将保持活动状态的超时时间设置为0,这样调用close将实际关闭服务器,
  • 或者在不同的端口上启动每个服务器,尽管当您有大量测试时,这变得难以处理。
还有其他应对这种情况的想法吗?
PS:我之前问过一个问题如何立即关闭Node.js http(s)服务器?,并找到了一种可行的解决方法,但似乎这种解决方法不总是可靠的,因为我有时会得到奇怪的结果。

1
你首次如何启动服务器?你是从node还是其他脚本运行Node.js服务器? - jsalonen
我知道你可能有严格的要求,但是你真的需要在每次测试之后重新启动服务器吗?我的意思是,你能不能以某种方式重构代码,使得你可以在同一台服务器上运行多个测试? - jsalonen
服务器是使用Node.js编程方式启动的,使用通常的http.createServer.listen这些东西。不幸的是,是的,每个测试都需要一个新实例 :-/ - Golo Roden
1个回答

2
function createOneRequestServer() {
    var server = http.createServer(function (req, res) {
        res.write('write stuff');
        res.end();
        server.close();
    }).listen(8080);
}

你也可以考虑使用进程来分叉进程,在测试完该进程后杀死它。
var child = fork('serverModuleYouWishToTest.js');

function callback(signalCode) {
    child.kill(signalCode);
}

runYourTest(callback);

这种方法是可取的,因为它不需要您编写特殊情况的服务器来仅服务一个请求,并且使您的测试代码和生产代码完全独立。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接