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

dre*_*www 90 testing unit-testing mocha.js node.js express

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

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

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

Ric*_*aca 135

事情发生了变化,因为快速服务器不再继承自节点http服务器.幸运的是,app.listen返回服务器实例.

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};
Run Code Online (Sandbox Code Playgroud)

  • 在Mocha测试的情况下,你需要('app')我扩展到app对象:app.server = app.listen(3000); 所以后来我可以说:var app = require('./ app'); app.server.close(); (19认同)
  • 注意:'app' 是 Express Application 实例,和 'app.listen' 的返回值有很大的区别,它是具有 'close' 方法的底层原生 HTTP Server 实例。@JackChi 在上面暗示了这一点。 (3认同)
  • 在测试服务器时,请查看https://github.com/visionmedia/supertest,它将使您测试不启动实际服务器 (2认同)

Sri*_*ary 15

使用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);
Run Code Online (Sandbox Code Playgroud)

调用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

  • 这是快递3以来的无效. (3认同)
  • 公开这样的URL来关闭服务器不是恕我直言。 (3认同)