2

I'd like to mock MongoDB dependency with proxyquire by doing this in my test:

var proxyquire = require('proxyquire');
var controller = path.resolve('.path/to/controller/file.js');

in the before each statement:

mocked_mongoose = {
     isMocked: true,
     model: function(name, schema, collection, skipInit) {
         return {
             find: function(conditions, projection, options, callback) {
                 console.log('callback find');
                 return callback();
             },
             save: function(options, fn) {
                 console.log('callback save');
                 return callback();
             },
             findOne: function(conditions, projection, options, callback) {
                 console.log('callback find one');
                 var model = mongoose.model(name);
                 var fakeModel = fakery.fake(model);
                 return callback(null, fakemodel);
             }
         }
     }
 };

proxyquire(controller, {
     'mongoose': mocked_mongoose
 });

and when I go to the controller and do console.log(mongoose.isMocked) I got undefined and if I print mongoose.model.toString() seems like the mongoose methods aren't overridden.

I followed up this article and tried to implement the same logic, but I'm not getting the same results.

any help will be appreciated, thanks!

pedrommuller
  • 15,741
  • 10
  • 76
  • 126

1 Answers1

1

I ended up by changing the way I was defining my mocked mongoose object, to match exactly the scenarios I wanted to test in mt case:

first model instantiation

var Model = mongoose.model('SchemaDef');
var other = Model({
 _id:'someId'
 name'Some other fields'
});

model search:

Model.findOne(query, callback);

this the version how it works:

'use strict';
var factory = require('factory-girl');
var mongoose = require('mongoose');

    function viewModel(name){
        function constructor(obj){
            if(obj){
                obj.find = constructor.find;
                obj.save = constructor.save;
                obj.findOne = constructor.findOne;
            }
            return obj;

        };
        constructor.isMocked = true;
        constructor.find = function(query, callback){
            factory.build(name, function(err, mockedModel){
                return callback(null,[mockedModel]);
            });

        };

        constructor.save = function(callback){
            factory.build(name, function(err, mockedModel){
                return callback(null,[mockedModel]);
            });
        };

        constructor.findOne=function(query,callback){
            factory.build(name, function(err, mockedModel){
                return callback(null,mockedModel);
            });
        };

        return constructor;
    };

module.exports = {
    model:function(name){
        factory.define(name, mongoose.model(name));
        return viewModel(name);
    }
};
pedrommuller
  • 15,741
  • 10
  • 76
  • 126