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 退出