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

spe*_*990 6 testing node.js sentry supertest jestjs

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

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

应用程序.js

Sentry.init({ environment: "development", dsn: "..." });
app.use(Sentry.Handlers.requestHandler());
...
app.use(Sentry.Handlers.errorHandler());
Run Code Online (Sandbox Code Playgroud)

我有一个简单的测试,定向到主页并期望 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);
    });
});
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢您的帮助。

小智 2

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

在 package.json 的测试脚本中,我设置 NODE_ENV 环境变量进行测试。

  "scripts": {
    "test": "NODE_ENV=test jest --detectOpenHandles -i",
    "test:watch": "NODE_ENV=test jest --watch --coverage=false --
  },
Run Code Online (Sandbox Code Playgroud)

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

  "scripts": {
    "test": "NODE_ENV=test jest --detectOpenHandles -i",
    "test:watch": "NODE_ENV=test jest --watch --coverage=false --
  },
Run Code Online (Sandbox Code Playgroud)