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