在 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.js。 require()
实际上会评估整个 js 文件,因此 .listen()
调用将是 运行.
您可以通过设置一个只有在 运行测试时才会设置的环境变量来解决这个问题,比如 process.env.CI
。那么
if (!process.env.CI) {
app.listen(3000, function () {
console.log('Uzay live on port 3000!')
})
}
简介: 在 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.js。 require()
实际上会评估整个 js 文件,因此 .listen()
调用将是 运行.
您可以通过设置一个只有在 运行测试时才会设置的环境变量来解决这个问题,比如 process.env.CI
。那么
if (!process.env.CI) {
app.listen(3000, function () {
console.log('Uzay live on port 3000!')
})
}