在 Mocha 测试文件中要求 Express 应用程序启动服务器本身

Requiring an Express app in a Mocha Test file starts the server itself

简介: 在 Mocha 中使用 Supertest 为 Express 驱动的 RESTful HTTP API 编写测试时,众所周知我们必须 require快递应用程序的一个实例。但是,这个 require 语句显然是测试完成并清理后打开连接的根本原因。这是一个奇怪的情况,完全出乎意料。

背景: 有问题的存储库位于 GitHub sakshamsaxena/uzay [1] 这些测试在语法上是 Super Test 本身推荐的典型语法。 request 创建服务器,传递给 expect 的回调关闭服务器。这已通过向 node_modules 中的库文件添加 console.log 行来验证。经验证,所有连接均已正常关闭并且测试正常通过。在此期间没有遇到其他 notification/warning 任何事情,但 Mocha 从未自行退出。我很清楚 Mocha 4+ 的行为,并使用 WTFNode 对此进行了调查。在 SIGINT 上,注意到 [2][3] 一个 app 实例仍然存在。自然地,我通过注释掉所有测试并使用 WTFNode 再次 运行ning 套件来仔细检查这一点,结果却遇到了完全相同的消息。现在,该测试没有真正的测试,只有未决测试和 2 个 require 语句 [4],其中一个显然是罪魁祸首。 happening/what 我做错了什么?

参考资料:

[1] : https://github.com/sakshamsaxena/uzay/

[2] :

[WTF Node?] open handles:
- File descriptors: (note: stdio always exists)
  - fd 1 (stdio)
  - fd 2 (stdio)
- Servers:
  - :::3000 (HTTP)
    - Listeners:
      - request: app @ 
D:\Personal\uzay\node_modules\express\lib\application.js:617

[3] : https://github.com/myndzi/wtfnode/blob/a080e019f06187aa1e762ac9025bd22430d4129c/index.js#L512

[4] :

const request = require('supertest')
const app = require('../index.js')

问题: 要求快速服务器不应该 运行 服务器。如果没有显式调用 listen 服务器不应该启动,但它以某种方式启动了。为什么会这样?这可能是什么原因?

您在测试中需要根 index.jsrequire() 实际上会评估整个 js 文件,因此 .listen() 调用将是 运行.

您可以通过设置一个只有在 运行测试时才会设置的环境变量来解决这个问题,比如 process.env.CI。那么

if (!process.env.CI) {
  app.listen(3000, function () {
    console.log('Uzay live on port 3000!')
  })
}