如何以编程方式关闭ExpressJS实例进行测试?

时间:2011-12-28 17:11:42

标签: unit-testing testing node.js express mocha

我正在试图找出如何关闭Express的实例。基本上,我想要.listen(port)调用的反转 - 如何让Express服务器停止监听,释放端口,并干净地关闭?

我知道这似乎是一个奇怪的查询,所以这里是上下文;也许还有另一种方法可以解决这个问题,我认为这是错误的方式。我正在尝试为我的socket.io/nodejs应用程序设置测试框架。这是一个单页应用程序,所以在我的测试脚本中(我使用Mocha,但这并不重要)我希望能够启动服务器,对它运行测试,然后关闭服务器关闭。我可以通过假设在测试开始之前打开服务器或者让其中一个测试启动服务器并让每个后续测试都认为它已经启动来解决这个问题,但这真的很麻烦。我更希望每个测试文件都使用适当的设置启动服务器实例,然后在测试结束时关闭该实例。这意味着运行测试没有奇怪的依赖关系,一切都很干净。这也意味着我可以进行启动/关机测试。

那么,有关如何做到这一点的任何建议?我已经考虑过手动触发异常以降低异常,但这看起来很混乱。我已经挖掘了Express文档和源代码,但似乎无法找到任何关闭服务器的方法。 socket.io中可能还有一些内容,但由于套接字服务器只是连接到Express服务器,我认为这需要在快速层发生。

5 个答案:

答案 0 :(得分:131)

Things have changed因为快速服务器不再继承自节点http服务器。幸运的是,app.listen返回服务器实例。

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};

答案 1 :(得分:13)

使用app.close()。完整的例子:

var app = require('express').createServer();
app.get('/', function(req, res){
  res.send('hello world');
});
app.get('/quit', function(req,res) {
  res.send('closing..');
  app.close();
});
app.listen(3000);

测试结束后,在回调中调用app.close()。但请记住,该过程仍在运行(虽然它不再是在监听)。

如果在此之后,您需要结束该过程,然后拨打process.exit(0)

链接:

app.close:http://nodejs.org/docs/latest/api/http.html#server.close(同样适用)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit

答案 2 :(得分:0)

您可以通过编写bash脚本来启动服务器,运行测试和停止服务器来轻松完成此操作。这样做的好处是允许您使用该脚本的别名来快速轻松地运行所有测试。

我在整个持续部署过程中使用这些脚本。您应该查看Jon Rohan's Dead Simple Git Workflow以获得对此的一些见解。

答案 3 :(得分:0)

//... some stuff 

var server = app.listen(3000);
server.close();

答案 4 :(得分:0)

最新版本的 express 支持此解决方案:

const server = app.listen(port);

const shutdown = () => {
  server.close();
}
相关问题