【发布时间】:2019-05-20 16:07:47
【问题描述】:
简介: 在 Mocha 中使用 Supertest 为 Express 驱动的 RESTful HTTP API 编写测试时,我们必须 require 一个 express 应用程序的实例。但是,这个 require 语句显然是测试完成并清理后打开连接的根本原因。这是一个奇怪的情况,完全出乎意料。
背景: 有问题的存储库位于 GitHub 上的 sakshamsaxena/uzay [1]
这些测试在语法上与 Super Test 本身推荐的语法是典型的。 request 创建服务器,传递给expect 的回调关闭服务器。这已通过将console.log 行添加到node_modules 中的库文件来验证。已验证所有连接都已正常关闭并且测试正常通过。在此期间没有遇到任何其他通知/警告,但 Mocha 从未自行退出。我非常了解 Mocha 4+ 的行为,并使用 WTFNode 对此进行了调查。在 SIGINT 上,注意到[2][3] app 实例仍然存在。自然,我通过注释掉所有测试并再次使用 WTFNode 运行套件来仔细检查,结果却遇到了完全相同的消息。目前,该测试没有真正的测试,只有待处理的测试,并且 2 个要求语句 [4] 其中一个显然是罪魁祸首。发生了什么/我做错了什么?
参考资料:
[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 的显式调用,服务器不应该启动,但它会以某种方式启动。为什么会这样?这可能是什么原因?
【问题讨论】: