【问题标题】:Requiring an Express app in a Mocha Test file starts the server itself在 Mocha 测试文件中要求 Express 应用程序会启动服务器本身
【发布时间】: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 的显式调用,服务器不应该启动,但它会以某种方式启动。为什么会这样?这可能是什么原因?

【问题讨论】:

    标签: node.js express mocha.js


    【解决方案1】:

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

    您可以通过设置一个仅在运行测试时设置的环境变量来解决该问题,例如process.env.CI。那么

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

    【讨论】:

    • 我确实有这个想法,但没有尝试,因为我从未收到 Uzay live on port 3000! 消息,我认为如果 listen 被调用我会收到.虽然你说的确实有效!
    • 可能你的 mocha 配置以某种方式覆盖了 console.log 输出
    • 不,事实上我已经提到我通过添加console.log 行来检查服务器关闭通过超级测试,它没问题。也尝试在listen 之前放置一个,也很好。
    • 试过app.listen(3000, function () { process.env.DEMO = 'DEMO'; console.log('Uzay live on port 3000!') }) 并将这个环境变量记录在一个新的after() 测试套件块中,按预期返回“DEMO”。验证它是否触发了回调,但 console 显然当时不可用。哼!谢谢,这是一次很棒的学习经历。
    • 编辑:不知何故,我开发了一个盲点,但 listenconsole.log 消息总是会出现(检查以前的 travis 构建日志),我猜我只是对它视而不见。给您添麻烦了!
    猜你喜欢
    • 2018-08-05
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2014-10-18
    • 1970-01-01
    • 2019-01-18
    • 2023-03-24
    相关资源
    最近更新 更多