【发布时间】: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