Jest Unit Testing Возвращает "MongoError: топология была уничтожена" - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь использовать Jest для запуска модульных тестов с моим приложением Node.js.

Я создал сценарий установки, чтобы закрыть соединение с mongoose, вызвав функцию afterAll().

У меня проблема в том, что после запуска модульного теста в консоли отображается ошибка MongoError: topology was destroyed.

Я считаю, что это связано с тем, как я реализую асинхронные функции ... может быть, я не жду достаточно долго, чтобы вернуть обещание? Смотрите код ниже.

Jest Config (package.json):

"jest": {
    "testEnvironment": "node",
    "setupFilesAfterEnv": [
      "./tests/setup.js"
    ]
  },

Сценарий установки (./tests/setup.js):

const mongoose = require("mongoose");
const config = require("../config/config");

beforeAll(async function() {
    // Define database credentials.
    let dbUser = encodeURIComponent(config.db.username);
    let dbPass = encodeURIComponent(config.db.password);
    let dbDatabase = encodeURIComponent(config.db.database);
    let mongoUri = `mongodb://${dbUser}:${dbPass}@${config.db.host}:${config.db.port}/${dbDatabase}`;

    // Connect to the database.
    await mongoose.connect(mongoUri, { useNewUrlParser: true }, function(err) {
        if(err) throw err;
    });
});

beforeEach(async function() {
    // Clear the database.
    await mongoose.connection.dropDatabase(function(err) {
        if(err) throw err;
    });
});

afterAll(async function() {
    // Terminate the database connection.
    mongoose.connection.close(function(err) {
        if(err) throw err;
    });
});

Модульный тест (./tests/models/api_session.test.js):

const ApiSession = require("../../app/models/api_session");

describe("new session", function() {
    test("valid session", function(done) {
        let apiSession = new ApiSession({ authCode: "12345" });
        apiSession.save(function(err, result) {
            if(err) done(err);

            expect(result.authCode).toBe("12345");
            done();
        });
    });

    test("empty session", function(done) {
        let apiSession = new ApiSession();
        apiSession.save(function(err) {
            expect(err.name).toBe("ValidationError");
            done();
        });
    });
});

Ответ (тест npm):

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.852s, estimated 1s
Ran all test suites.

MongoError: topology was destroyed
...

1 Ответ

1 голос
/ 04 июля 2019

Когда вы впервые подключаетесь к Монго, у вас есть топология. В ваших тестовых хуках вы отбрасываете базу данных (что разрушает топологию). Затем вы пытаетесь использовать то же соединение во втором тесте для подключения к базе данных, которой больше нет.

Я думаю, что ваш второй тест дает вам ложное срабатывание в отношении ошибки на самом деле . Я полагаю, если вы закомментируете блок beforeEach, вы получите другой результат теста.

Если вы хотите очистить коллекцию перед каждым тестом, вы должны использовать метод mongoose dropCollection в своем beforeEach хуке. Я думаю, коллекция должна быть автоматически создана Мангустом в вашем следующем тесте. Если коллекция не воссоздается, вы можете добавить метод mongoose createCollection в тот же хук.

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