Supertest 在 Node 中进行 Jest 测试时出现 MaxListenersExceedingWarning 错误

Posted

技术标签:

【中文标题】Supertest 在 Node 中进行 Jest 测试时出现 MaxListenersExceedingWarning 错误【英文标题】:Supertest giving MaxListenersExceedingWarning error with my Jest testing in Node 【发布时间】:2020-09-11 06:44:00 【问题描述】:

我正在使用 Jest 和 Supertest 和我的 Node Express 应用程序设置一些测试。

我也在使用 Sentry 来报告我的错误。我的 app.js 文件中有以下代码行来设置 Sentry:

app.js

Sentry.init( environment: "development", dsn: "..." );
app.use(Sentry.Handlers.requestHandler());
...
app.use(Sentry.Handlers.errorHandler());

我有一个指向主页的简单测试,需要 200 个状态码。

home.test.js

const app = require("../src/app");
const request = require("supertest")(app);

describe("homepage", () => 
    it("welcomes the user", async () => 
        await request.get("/").expect(200);
    );
);

然后我在控制台中运行我的npm run test 脚本。测试通过没有问题;但是,当测试运行多次(超过 10 次)时,我会收到一条错误消息。测试将通过,但我收到以下消息。

(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 response listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 response listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 response listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 response listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit
(node:84470) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 response listeners added to [ClientRequest]. Use emitter.setMaxListeners() to increase limit

我知道 Supertest 存在问题,因为如果我的测试仅包含一个简单的测试,例如 expect(2+2).toBe(4);,则没有问题。只有当我“请求”一条路线时(await request.get("/").expect(200);)。

由于我正在请求应用程序,下一个问题是使用app.use(Sentry.Handles.requestHandler());app.use(Sentry.Handlers.errorHandler()); 添加了多个错误和响应侦听器。如果我删除我的 Sentry 初始化代码,一切都会正常运行。

我无法删除这些行,因为 Sentry 不起作用,但我不确定该怎么做。我看了又看,但找不到其他人有类似的问题。老实说,我不确定要搜索什么。我已经工作了几天了,我很茫然。

感谢您的帮助。

【问题讨论】:

我去年也遇到了同样的问题。到目前为止,我发现的唯一解决方案是不要在测试期间安装 Sentry 中间件。如果能够留下它们以便更好地重现生产环境以进行集成测试,那就太好了 【参考方案1】:

我也遇到了这个问题,我找到的解决方案是:

在 package.json 中,在测试脚本中,我设置了 NODE_ENV 环境变量来测试。

  "scripts": 
    "test": "NODE_ENV=test jest --detectOpenHandles -i",
    "test:watch": "NODE_ENV=test jest --watch --coverage=false --
  ,

在 app.js 中,如果我们在测试环境中,我们不会启动 Sentry。这将通过一个条件来完成。

if (process.env.NODE_ENV !== 'test') 
  Sentry.init( environment: "development", dsn: "..." )

【讨论】:

以上是关于Supertest 在 Node 中进行 Jest 测试时出现 MaxListenersExceedingWarning 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NodeJS 解决 Supertest 和 jest 中的 ECONNREFUSED 错误?

在 Node + Express API 中检测到的打开句柄会阻止 Jest 退出

用 Jest 和 supertest 测试 responsebody

在 Jest 中测试失败时如何打印请求和响应?

如何与Jest共享多个套件中的测试用例?

在 node.js 服务器上使用 supertest/superagent 读取响应输出缓冲区/流