DrakaSAN DrakaSAN - 4 months ago 41
Node.js Question

Mockgoose: how to simulate a error in mongoose?

I am trying to do unit test around a mongoose powered application.
While mockgoose does a great work at simulating mongoose so I can test around it, I didn t find a way to push it to fail a call, so I can test the error handling logic.

Is it a supported use case? Or should I find another framework?

Code:

var mongoose = require('mongoose');

var Test = {},
Doc = require('./model/Doc.js');

var dbURL = 'mongodb://127.0.0.1/',
dbName = 'Test';

function connect(callback) {
Test = mongoose.createConnection(dbURL + dbName); //<-- Push this to fail
Test.on('error', (err) => {
callback(err);
});
Test.once('open', function () {
callback();
});
}


Test:

var chai = require('chai'),
expect = chai.expect,
util = require('util');

var config = require('./config.json');

var proxyquire = require('proxyquire').noPreserveCache();
var sinon = require('sinon');
var mongoose = require('mongoose');
var mockgoose = require('mockgoose');

describe('test', () => {
describe('Connect', () => {
beforeEach((callback) => {
mockgoose(mongoose).then(() => {
callback();
});
});

it('Expect to connect to the database', (done) => {
var stub = {
mongoose: mongoose
},
test = proxyquire('./../test.js', {
'mongoose': stub.mongoose
});

test.connect((err) => {
try {
expect(err).to.not.be.ok;
done();
} catch(err) {
done(err);
}
});

it('Expect to throw error when failing to connect to the database', (done) => {
var stub = {
mongoose: mongoose
},
medical = proxyquire('./../medical.js', {
'mongoose': stub.mongoose
});

medical.connect((err) => {
try {
expect(err).to.be.ok;
done();
} catch(err) {
done(err);
}
});
});
});
});


Result in:

Connect
✓ Expect to connect to the database
1) Expect to throw error when failing to connect to the database


1 passing (234ms)
1 failing

1) Medical Connect Expect to throw error when failing to connect to the database:
AssertionError: expected undefined to be truthy

Answer

I ended up stubing mongoose.createConnection (so the generator) to return a object which call the error.

            let stub = {
                mongoose: {
                    createConnection: () => {
                        return {
                            on: (eventName, callback) => {
                                if(eventName === 'error') {
                                    callback('Medical Error');
                                }
                            },
                            once: () => {}
                        }
                    }
                }
            },
            medical = proxyquire('./../medical.js', {
                'mongoose': stub.mongoose
            });