我正在使用 MongoDB 数据库为我的 NodeJS 应用程序编写一些集成和系统测试。我使用的测试框架是 Mocha 和 Supertest。是否可以将 MongoDB 设置为内存数据库,我只能使用它进行测试,然后在测试完成后擦除我的所有集合和文档?
问问题
23633 次
2 回答
33
您可以使用mongodb-memory-server完成此操作。该软件包将 mongod 二进制文件下载到您的主目录,并根据需要实例化一个新的内存支持 MondoDB 实例。对于每个测试文件,您都可以启动一个新服务器,这意味着您可以并行运行它们。
对于使用jest和本机 mongodb 驱动程序的读者,您可能会发现这个类很有用:
const { MongoClient } = require('mongodb');
const { MongoMemoryServer } = require('mongodb-memory-server');
// Extend the default timeout so MongoDB binaries can download
jest.setTimeout(60000);
// List your collection names here
const COLLECTIONS = [];
class DBManager {
constructor() {
this.db = null;
this.server = new MongoMemoryServer();
this.connection = null;
}
async start() {
const url = await this.server.getUri();
this.connection = await MongoClient.connect(url, { useNewUrlParser: true });
this.db = this.connection.db(await this.server.getDbName());
}
stop() {
this.connection.close();
return this.server.stop();
}
cleanup() {
return Promise.all(COLLECTIONS.map(c => this.db.collection(c).remove({})));
}
}
module.exports = DBManager;
然后在每个测试文件中,您可以执行以下操作:
const dbman = new DBManager();
afterAll(() => dbman.stop());
beforeAll(() => dbman.start());
afterEach(() => dbman.cleanup());
我怀疑这种方法可能与其他测试框架类似。
于 2018-08-03T17:51:43.257 回答
7
我推荐使用 mongodb-memory-server。
我有一个在整个项目中共享的数据库文件,所以我也必须让它可测试。
//db.js
import mongoose from 'mongoose';
import bluebird from 'bluebird';
module.exports = {
mongoose,
init: () => {
mongoose.Promise = bluebird;
},
connect: async database => {
try {
const conn = await mongoose.connect(
database,
{ useNewUrlParser: true }
);
//eslint-disable-next-line
console.log(`MongoDb Connected on: ${database}`);
return conn;
} catch (err) {
//eslint-disable-next-line
console.log('Error to connect on mongo', err);
}
},
disconnect: async () => await mongoose.connection.close()
};
为了在我的测试中使用(db.js),我创建了一个 test-helper.js 文件。
'use strict';
import MongodbMemoryServer from 'mongodb-memory-server';
import db from '../src/db';
const server = new MongodbMemoryServer();
const createDB = async () => {
try {
const url = await server.getConnectionString();
db.connect(url);
} catch (err) {
throw err;
}
};
const destroyDB = () => {
db.disconnect();
};
module.exports = {
createDB,
destroyDB
};
}
所以,我的测试总是在(创建和销毁 de DB)之前和之后,比如:
import { createDB, destroyDB } from '../test-helper';
before(() => {
createDB();
});
after(() => {
destroyDB();
});
希望它是有帮助的。
于 2019-04-17T18:15:55.487 回答