我想通过在我的测试中这样做来模拟MongoDB依赖于丙氧奎尔:
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)时,我得到了未定义的信息,如果我打印mongoose.model.toString(),看起来就好像不会覆盖猫鼬方法。
我跟踪了这篇文章,并试图实现相同的逻辑,但没有得到相同的结果。
任何帮助都将不胜感激,谢谢!
发布于 2016-01-21 15:21:48
最后,我改变了定义模拟猫鼬对象的方式,以与我想在mt中测试的场景完全匹配:
第一模型实例化
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);
}
};https://stackoverflow.com/questions/34816660
复制相似问题