用proxyquire嘲笑MongoDB

我想通过在我的testing中做这个来嘲弄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()似乎没有重写mongoose的方法。

我跟随这篇文章,并试图实现相同的逻辑,但我没有得到相同的结果。

任何帮助将不胜感激,谢谢!

最后,我改变了自己定义我的嘲讽的mongoose对象的方式,以匹配我想要testing的场景:

第一个模型实例

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

型号search:

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