2013-07-26 28 views
2

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

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

当然这是不能接受的运行测试。

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

  • 保持连接超时设置为0,所以close通话将实际关闭服务器,
  • 或每次启动服务器位于不同的端口上,但当您进行大量测试时,这变得很难处理。

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

PS:我有一个要求How do I shutdown a Node.js http(s) server immediately?前一阵子,发现一个可行的办法来解决它,但因为它似乎这种解决方法并不在任何情况下可靠地运行,因为我得到了奇怪的结果,不时。

+1

如何在第一个地方启动服务器?您是从节点还是从其他脚本运行node.js服务器? – jsalonen

+0

另外我明白你可能有严格的要求,但是你真的需要在每次测试后重新启动服务器吗?我的意思是你能重构一些东西,让你可以在同一台服务器上运行多个测试吗? – jsalonen

+0

使用通常的'http.createServer.listen'东西,使用Node.js以编程方式启动服务器。不幸的是,我* DO *需要在每个测试中都有一个新实例: - / –

回答

1
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); 

这种方法是可取的,因为它不要求你写你的服务器的特殊情况下,以服务只有一个要求,并保持你的测试代码和产品代码100%无关。