2016-01-15 5 views
2

Я хотел бы издеваться MongoDB зависимость с proxyquire , делая это в моем тесте:насмешливый MongoDB с proxyquire

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

в перед каждым заявление:

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 
}); 

и когда я перейдите к контроллеру и сделайте console.log (mongoose.isMocked) Я получил undefined, и если я напечатаю mongoose.model.toString(), похоже, что методы мангуста не переопределены.

Я следил за this article и пытался реализовать ту же логику, но я не получаю одинаковых результатов.

любая помощь будет оценена, спасибо!

ответ

1

Я закончил тем, что изменения, как я определял мой высмеивал объект мангуста, чтобы соответствовать точно сценариев, которые я хотел, чтобы проверить в мт случае:

первая модель конкретизации

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

поиск модели:

Model.findOne(query, callback); 

это версия, как это работает:

'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); 
    } 
};