玩笑单元测试返回“ MongoError:拓扑已被破坏”

时间:2019-07-04 05:30:20

标签: node.js mongodb mongoose promise jestjs

我正在尝试使用Jest通过Node.js应用程序运行单元测试。

我已经创建了一个设置脚本,以通过调用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();
        });
    });
});

响应(np​​m测试):

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 个答案:

答案 0 :(得分:1)

首次连接mongo时,您具有拓扑。在测试挂钩中,删除数据库(这将炸毁拓扑)。然后,您尝试在第二个测试中使用相同的连接来连接不再存在的数据库。

我认为您的第二项测试对确实错误有误判。我想如果您注释掉beforeEach块,您将获得不同的测试结果。

如果您希望在每次测试前清除集合,则应在beforeEach钩子中使用猫鼬的dropCollection方法。我认为集合应该在您的下一个测试中由猫鼬自动创建。如果未重新创建集合,则可以在同一钩子中添加猫鼬的createCollection方法。