The package mongodb-mocker is a class that abstracts an in-memory mongodb database. Its purpose is to aid developing of tests that use the mongodb database without writing a mock or connecting to a real database.
npm install --save-dev mongodb-mocker
const MongodbMocker = require('mongodb-mocker');
const yourDatabaseClient = new Db();
const mongodbMocker = new MongodbMocker({ port: '8000' });
describe('Your tests', () => {
before(() => mongodbMocker.start());
// yourDatabaseClient should connect to 'localhost:8000/yourDatabaseName'
beforeEach(() => yourDatabaseClient.initialize());
// make sure to clean up your client
afterEach(() => yourDatabaseClient.shutDown());
after(() => mongodbMocker.shutDown());
// Tests here that use your database client
});
in Names.js
const mongoose = require('mongoose');
const schema = new mongoose.Schema({
name: {
type: String,
max: [50, 'Name too long (>50)'],
min: 1,
required: true,
},
});
const Names = mongoose.model('names', schema);
module.exports = Names;
in db.js
const mongoose = require('mongoose');
class Db {
constructor() {
this.mongoose = mongoose;
this.mockedServer = null;
}
shutDown() {
return this.mongoose.disconnect((e) => {
if (e) { Promise.reject(e); }
return Promise.resolve();
});
}
initialize(dbName) {
const url = process.env.MONGODB_URL;
this.uri = `mongodb://${url}/${dbName}`;
return Promise.resolve()
.then(() => this.mongoose.connect(this.uri, (err) => {
if (err) { return Promise.reject(err); }
return Promise.resolve(this.mongoose.createConnection(this.uri));
}))
.then(conn => Promise.resolve(conn.connections[0]));
}
}
module.exports = Db;
in db.spec.js
/* global describe it before beforeEach afterEach */
process.env.NODE_ENV = 'test';
process.env.MONGODB_URL = 'localhost:8000';
const chai = require('chai');
const Db = require('./db');
const Names = require('./Names');
const MongodbMocker = require('mongodb-mocker');
const should = chai.should();
const db = new Db();
describe('Db class', () => {
before(() => {
const mongodbMocker = new MongodbMocker({ port: '8000' });
return mongodbMocker.start();
});
beforeEach(() => db.initialize());
afterEach(() => db.shutDown());
it('can save a Names record in test mode', () => Names
.insertMany([{ name: 'MyName' }])
.then(res => Names.findById(res[0]._id))
.then((res) => {
should.exist(res);
res.should.be.an('object');
res.name.should.equal('MyName');
}));
});
Run this example from the root of this repository
npm i
mocha ./example/db.spec.js