【问题标题】:mongoose.connect leaves open handles after jest testmongoose.connect 在开玩笑测试后留下打开的句柄
【发布时间】:2022-02-16 22:37:24
【问题描述】:

如何摆脱mongoose.connect在开玩笑测试中留下的openHandles

const { startTestDB } = require("../conn");
const mongoose = require("mongoose");
const request = require("supertest");
const faker = require("faker");
const app = require("../app");
const fs = require("fs");

describe("test1: ", () => {
  beforeAll(() => {
    startTestDB()
      .then(() => {
        console.log("Connected to db.");
      })
      .catch((e) => {
        console.log(e);
      });
  });

  afterAll(() => {
    mongoose
      .disconnect()
      .then(() => {
        console.log('db connection is closed');
      })
      .catch((e) => {
        console.error(e);
      });
  });

  it("Should save a new user", async () =>
    request(app)
      .post("/save")
      .send({
        name: faker.internet.userName(),
        email: faker.internet.email()
      })
      .expect(201));
});

这是一个具有相同问题的示例代码,当我运行npx jest --detectOpenHandles 时,我在mongoose.connect 找到了一个,据我所知,由于异步操作在测试之前没有完成,所以会出现打开句柄,但我很清楚关闭afterAll中的连接。

我得到的错误信息:

  ●  TLSWRAP

       9 |
      10 | module.exports.startTestDB = () =>
    > 11 |   mongoose.connect(
         |            ^
      12 |     `mongodb+srv://${mongodb.user}:${mongodb.password}@${mongodb.host}/${mongodb.db}-test?retryWrites=true&w=majority`,
      13 |     {
      14 |       useNewUrlParser: true,

      at parseSrvConnectionString (node_modules/mongodb/lib/core/uri_parser.js:67:7)
      at parseConnectionString (node_modules/mongodb/lib/core/uri_parser.js:597:12)
      at connect (node_modules/mongodb/lib/operations/connect.js:282:3)
      at node_modules/mongodb/lib/mongo_client.js:260:5
      at maybePromise (node_modules/mongodb/lib/utils.js:692:3)
      at MongoClient.Object.<anonymous>.MongoClient.connect (node_modules/mongodb/lib/mongo_client.js:256:10)
      at node_modules/mongoose/lib/connection.js:835:12
      at NativeConnection.Object.<anonymous>.Connection.openUri (node_modules/mongoose/lib/connection.js:832:19)
      at node_modules/mongoose/lib/index.js:351:10
      at node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
      at promiseOrCallback (node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
      at Mongoose.Object.<anonymous>.Mongoose._promiseOrCallback (node_modules/mongoose/lib/index.js:1149:10)
      at Mongoose.connect (node_modules/mongoose/lib/index.js:350:20)
      at startTestDB (conn.js:11:12)
      at tests/s.test.js:10:5
      at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13)
      at runJest (node_modules/@jest/core/build/runJest.js:387:19)
      at _run10000 (node_modules/@jest/core/build/cli/index.js:408:7)
      at runCLI (node_modules/@jest/core/build/cli/index.js:261:3)

【问题讨论】:

  • 您找到解决方案了吗?我已经尝试像您一样关闭连接,并且还按照其他答案中的建议对代码进行了一些更改,但句柄仍然为我打开

标签: node.js mongoose jestjs


【解决方案1】:

我从这个问题jest and mongoose - jest has detected opened handles 重新发布我的答案,因为这是我解决问题的方法。

像许多其他人建议的那样关闭连接对我不起作用。

在搜索 SO 和 github 问题的解决方案数小时后,我遇到了这个 github 线程 https://github.com/visionmedia/supertest/issues/520,它提供了多种解决方案。最终对我有用的是在我的根目录中实现一个全局拆卸文件,如下所示:

// test-teardown-globals.js
module.exports = () => {
  process.exit(0);
};

还可以稍微调整我的 jest.config.js

// jest.config.js
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  globalTeardown: '<rootDir>/test-teardown-globals.js',
};

【讨论】:

    猜你喜欢
    • 2022-08-07
    • 2021-07-01
    • 1970-01-01
    • 2018-08-23
    • 2020-03-02
    • 2020-02-06
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多