【问题标题】:Shutting down a Node.js http server in a unit test在单元测试中关闭 Node.js http 服务器
【发布时间】:2013-07-26 14:58:25
【问题描述】:

假设我有一些测试 Web 服务器的单元测试。由于我不想在这里讨论的原因(范围之外;-)),每个测试都需要一个新启动的服务器。

只要我不向服务器发送请求,一切都很好。但是一旦我这样做了,对 http 服务器的 close 函数的调用就无法按预期工作,因为所有发出的请求都会导致保持连接,因此服务器在实际关闭之前会等待 120 秒。

当然,这对于运行测试是不可接受的。

目前,我看到的唯一解决方案是

  • 将keep-alive超时设置为0,因此调用close实际上会关闭服务器,
  • 或者在不同的端口上启动每个服务器,尽管当您进行大量测试时这会变得难以处理。

关于如何处理这种情况的任何其他想法?

PS:我前一阵子问过How do I shutdown a Node.js http(s) server immediately?,并找到了一种可行的解决方法,但似乎这种解决方法在每种情况下都不能可靠运行,因为我得到了奇怪的结果不时。

【问题讨论】:

  • 首先如何启动服务器?您是从节点还是从其他脚本运行 node.js 服务器?
  • 另外我知道您可能有严格的要求,但是您真的需要在每次测试后重新启动服务器吗?我的意思是你可以重构一些东西,让你在同一台服务器上运行多个测试吗?
  • 服务器使用 Node.js 以编程方式启动,使用通常的 http.createServer.listen 东西。而且,不幸的是,是的,我确实需要在每个测试中都有一个新实例:-/

标签: node.js unit-testing webserver application-shutdown


【解决方案1】:
function createOneRequestServer() {
    var server = http.createServer(function (req, res) {
        res.write('write stuff');
        res.end();
        server.close();
    }).listen(8080);
}

您还可以考虑使用 process 来 fork 进程并在对该进程进行测试后终止它们。

var child = fork('serverModuleYouWishToTest.js');

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

runYourTest(callback);

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

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 2023-03-30
    • 2011-11-07
    • 2011-07-12
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多