MongoError: пул истощается, новые операции запрещены при использовании MongoMemoryServer в интеграционном тесте - PullRequest
1 голос
/ 11 апреля 2020

Я использую MongoMemoryServer для написания интеграционного теста. У меня есть два файла тестов интеграции. Когда я запускаю ИТ-тесты, я вижу следующее. Я не понимаю почему. Я использую jest js тестовый фреймворк.

Я вижу следующую ошибку, когда у меня есть два файла IT-теста

MongoError: pool is draining, new operations prohibited

      37 |   for (const key in collections) {
      38 |     const collection = collections[key];
    > 39 |     await collection.deleteMany();
         |                      ^
      40 |   }
      41 | };

Вот мои настройки

//db-handler.js
const mongoose = require("mongoose");
const { MongoMemoryServer } = require("mongodb-memory-server");
const mongod = new MongoMemoryServer();

module.exports.connect = async () => {
  const uri = await mongod.getConnectionString();

  const mongooseOpts = {
    useNewUrlParser: true,
    autoReconnect: true,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 1000,
  };

  await mongoose.connect(uri, mongooseOpts);
};

module.exports.closeDatabase = async () => {
  await mongoose.connection.dropDatabase();
  await mongoose.connection.close();
  await mongod.stop();
};

module.exports.clearDatabase = async () => {
  const collections = mongoose.connection.collections;

  for (const key in collections) {
    const collection = collections[key];
    await collection.deleteMany();
  }
};

Все мои настройки ИТ-тестов выглядят так:

//example.it.test.js
const supertest = require("supertest");
const dbHandler = require("./db-handler");
const app = require("../../src/app");
const request = supertest(app);

const SomeModel = require("../Some");
beforeAll(async () => await dbHandler.connect());
afterEach(async () => await dbHandler.clearDatabase());
afterAll(async () => await dbHandler.closeDatabase());

describe("Some Test Block", () => {
  it("Test One", async (done) => {
    await SomeModel.create({a: "a", b "b"});

    const response = await request.get("/endPointToTest");
    expect(response.status).toBe(200);

    done();
  });

Когда у меня есть только один файл ИТ-тестов, все работает нормально. Когда я представляю новый файл ИТ-теста, аналогичный настройке example.it.test.js, новый тест не проходит. Пример сообщения об ошибке выше.

Чего мне не хватает? Нужно ли менять настройки, когда у меня несколько файлов ИТ-тестов?

ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ: Мой пакет. json файл выглядит как

{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest --runInBand ./tests"
  },
  "devDependencies": {
    "jest": "^25.2.7",
    "mongodb-memory-server": "^6.5.2",
    "nodemon": "^2.0.2",
    "supertest": "^4.0.2"
  },
  "jest": {
    "testEnvironment": "node",
    "coveragePathIgnorePatterns": [
      "/node_modules/"
    ]
  }
}

1 Ответ

0 голосов
/ 11 апреля 2020

По умолчанию Jest запускает тесты параллельно с «рабочим пулом дочерних процессов, выполняющих тесты» (документы Jest CLI). Согласно документации Jest.

Каждый тестовый файл устанавливает новое соединение с сервером mogodb, что вызывает ошибку.

Вы можете запустить тест Jest sequentially, чтобы избежать этого. проблема.

Опция --runInBand или -i Jest CLI позволяет запускать тесты последовательно (в непараллельном режиме).

Эта ошибка (пул истощается, новые операции запрещены ) может возникнуть, если вы используете официальную библиотеку mongodb для node js или mon goose. Пожалуйста, укажите размер пула при установлении соединения с mongodb.

module.exports.connect = async () => {
  const uri = await mongod.getConnectionString();
  const mongooseOpts = {
    useNewUrlParser: true,
    autoReconnect: true,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 1000,
    poolSize: 10,
  };
  await mongoose.connect(uri, mongooseOpts);
};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...