【问题标题】:MongoError: Topology is closed, please connect - when running unit tests with JestMongoError: Topology is closed, please connect - 使用 Jest 运行单元测试时
【发布时间】:2021-04-08 06:16:39
【问题描述】:

我正在尝试在内存中使用 Jest 和 mongodb 运行 Node 项目的单元测试。

该项目有一些迁移要插入到内存数据库中。

要启动该过程,我们使用以下脚本运行npm test

package.json

"scripts": {
    "test": "./node_modules/.bin/jest --verbose=true --coverage ./__test__/unit/",
  }

这是错误:

 (node:23353) [MONGODB DRIVER] DeprecationWarning: The option
 `autoReconnect` is incompatible with the unified topology, please read
 more by visiting...  PASS 
 __ test__/unit/util/stringUtil.test.js  PASS  __ test__/unit/validadores/validaPrazo.test.js  PASS  __ test__/unit/Services/alta-plataforma/realizarAnalise.test.js  Console

console.log src/persistencia/migrations/migration.js:40
  Não foram inseridas as collections: MongoError: Topology is closed, please connect
      at processWaitQueue (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:1011:42)
      at NativeTopology.selectServer (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:449:5)
      at executeWriteOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:937:12)
      at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:609:5)
      at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/topologies/native_topology.js:64:11)
      at OrderedBulkOperation.finalOptionsHandler (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1211:25)
      at executeCommands (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:527:17)
      at executeLegacyOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:389:24)
      at OrderedBulkOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1147:12)
      at BulkWriteOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/bulk_write.js:67:10)
      at InsertManyOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/insert_many.js:41:24)
      at /home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:72:19
      at maybePromise (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:685:3)
      at executeOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:34:10)
      at Collection.Object.<anonymous>.Collection.insertMany (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/collection.js:550:10)
      at NativeCollection.<computed> [as insertMany] (/home/ph/dev/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:218:28)
 {
    insertedDocs: [
      {
        grupos: [Array],
        _id: 605851b9cd5c445b3947c25f,
        beneficio: 'ALCADA NAO OBRIGATORIA',
        descricao: 'Não exige alçada para autorização',
        descricaoAltaPlataforma: 'Não exige alçada mínima',
        ativo: false,
        emergencial: true,
        categoria: 'ALCADA',
        prioridadeCategoria: 0,
        tipoRetorno: 'BENEFICIO',...

我们也面临这个错误:

MongoError: server is closed
              at executeWriteOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/server.js:461:14)
              at Server.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/server.js:382:5)
              at Object.callback (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:969:15)
              at processWaitQueue (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:1049:21)
              at NativeTopology.selectServer (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:449:5)
              at executeWriteOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:937:12)
              at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:609:5)
              at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/topologies/native_topology.js:64:11)
              at OrderedBulkOperation.finalOptionsHandler (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1211:25)
              at executeCommands (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:527:17)
              at executeLegacyOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:389:24)
              at OrderedBulkOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1147:12)
              at BulkWriteOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/bulk_write.js:67:10)
              at InsertManyOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/insert_many.js:41:24)
              at /home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:72:19
              at maybePromise (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:685:3) {
            insertedDocs: [
              {
                monitoracaoPlataforma: [],
                beneficiosRecebidos: [Array],

一些配置:

package.json

  "dependencies": {
    "@promster/express": "^4.0.0",
    "axios": "^0.21.1",
    "body-parser": "1.18.3",
    "bunyan": "file:bunyan-1.8.12.tgz",
    "consign": "0.1.6",
    "cors": "^2.8.5",
    "dotenv": "^7.0.0",
    "express": "4.16.3",
    "express-react-views": "^0.11.0",
    "express-validator": "^6.2.0",
    "jshint": "^2.11.0-rc1",
    "lodash": "^4.17.15",
    "moment": "^2.24.0",
    "mongoose": "^5.12.1",
    "morgan-body": "^2.4.8",
    "mysql": "2.16.0",
    "pg": "^7.11.0",
    "prom-client": "^11.5.3",
    "react": "^16.13.0",
    "react-dom": "^16.12.0",
    "react-tooltip": "^3.11.1",
    "request": "2.88.0",
    "swagger-jsdoc": "^3.4.0",
    "swagger-ui-express": "^4.1.2",
    "typings": "^2.1.1",
    "xml2js": "^0.4.22"
  },
  "devDependencies": {
    "@shelf/jest-mongodb": "^1.1.3",
    "eslint": "^5.14.1",
    "eslint-config-airbnb-base": "^13.1.0",
    "eslint-plugin-import": "^2.16.0",
    "jest": "^24.9.0",
    "jest-sonar-reporter": "^2.0.0",
    "mongodb-memory-server": "^6.0.1",
    "nock": "^11.7.0",
    "nodemon": "^1.19.4",
    "supertest": "3.3.0"
  }
}

jest.config.js

module.exports = {
  clearMocks: true,
  preset: '@shelf/jest-mongodb',
  testEnvironment: 'node',
  moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node']
};

jest-mongodb-config.js

module.exports = {
  mongodbMemoryServerOptions: {
    instance: {
      dbName: 'jest'
    },
    binary: {
      version: '4.0.3',
      skipMD5: true
    },
    autoStart: false
  }
};

globalConfig.json

{"mongoUri":"mongodb://127.0.0.1:34885/jest?","mongoDBName":"jest"}

连接方法:

/src/config/database.js

const mongoose = require('mongoose');
const logger = require('../util/logger');

exports.conectDb = function () {
  const senhaBD = process.env.MONGO_PASSWORD;
  const userBD = process.env.MONGO_USER;
  const hostBD = process.env.MONGO_HOST;
  const dataBaseBD = process.env.MONGO_DATABASE;
  const urlConexao = `mongodb://${userBD}:${senhaBD}@${hostBD}:27017/${dataBaseBD}`;
  const opcoesConexao = { autoReconnect: true, useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false };
  mongoose.connect(urlConexao, opcoesConexao);
};

exports.monitorarDb = function () {
  mongoose.connection.on('connected', () => {
    logger.logger.info('server mongodb conected');
  });
  mongoose.connection.on('error', (error) => {
    logger.logger.info(`Error to conecte ${error}`);
  });
  mongoose.connection.on('disconnected', () => {
    logger.logger.info('disconnected from mongodb');
  });
  mongoose.connection.on('reconnected', () => {
    logger.logger.info('Mongodb reconnected');
  });

  process.on('SIGINT', () => {
    mongoose.connection.close(() => {
      logger.logger.info('conection to mongoose finished');
      process.exit(0);
    });
  });
};

如何调用测试:

analise.test.js

const { MongoMemoryServer } = require('mongodb-memory-server');
const mongoose = require('mongoose');
const request = require('supertest');
const app = require('../../src/config/custom-express')();

const Migrations = require('../../src/persist/migrations/migration');

const mongoServer = new MongoMemoryServer();
const url = '/analise/analiseTemp';

describe(url, () => {

  beforeAll(async (done) => {
    const opcoesConexao = {
      autoReconnect: true, useNewUrlParser: true,
      useUnifiedTopology: true, useCreateIndex: true,
      useFindAndModify: false
    };
    mongoServer
      .getConnectionString()
      .then((mongoUri) => {
        return mongoose.connect(mongoUri, opcoesConexao, async (err) => {
          if (err) done(err);
          await Migrations(mongoose);
        });
      })
      .then(() => done());
  });

  afterAll(async (done) => {
    await mongoose.disconnect();
    await mongoServer.stop();
    done();
  });

  it('Deve responder 204 quando o endpoint for registrado', async (done) => {
    request(app)
      .options(url)
      .expect(204, done);
  });
});

所以我谦虚地向社区寻求帮助,我不知道如何使它工作

提前致谢!

【问题讨论】:

  • 请在内存中显示与mongodb的连接
  • @KevynKlava 完成,感谢您的联系

标签: javascript node.js mongodb mongoose jestjs


【解决方案1】:

getConnectionString() 方法已弃用,请改用 getUri()。

试试这个方法

describe(url, () => {

  beforeAll(async () => {
    const opcoesConexao = {
      autoReconnect: true, useNewUrlParser: true,
      useUnifiedTopology: true, useCreateIndex: true,
      useFindAndModify: false
    };

    const uri = await new MongoMemoryServer().getUri();
    await connect(uri, opcoesConexao, (err) => {
        if (!err) return;
        console.error(err);
        process.exit(1);
    });
    
    await Migrations(mongoose);
  });  
  
});

【讨论】:

  • 这个变化对我有用:const { MongoMemoryServer } = require("mongodb-memory-server"); let testDBServer; beforeAll(async () =&gt; { testDBServer = await MongoMemoryServer.create(); const uri = testDBServer.getUri(); await mongoose.connect(uri, { autoReconnect: true, useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }); }); afterAll(async () =&gt; { testDBServer.stop(); });
猜你喜欢
  • 2021-11-01
  • 2020-09-16
  • 2021-03-19
  • 2016-09-21
  • 2021-11-21
  • 2020-07-31
  • 2022-09-29
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多