我试图 stub 这个对象中使用的 Mongoose 依赖项:
var Page = function(db) {
var mongoose = db || require('mongoose');
if(!this instanceof Page) {
return new Page(db);
}
function save(params) {
var PageSchema = mongoose.model('Page');
var pageModel = new PageSchema({
...
});
pageModel.save();
}
Page.prototype.save = save;
}
module.exports = Page;
使用this question的答案,我尝试这样做:
mongoose = require 'mongoose'
sinon.stub mongoose.Model, 'save'
但是我得到了错误:
TypeError:尝试包装未定义的属性另存为函数
我也试过这个:
sinon.stub PageSchema.prototype, 'save'
然后我得到了错误:
类型错误:应该包装对象的属性
有人能帮忙吗?我究竟做错了什么?
最佳答案
我已经分析了 Mongoose 的来源,并且认为这是不可能的。保存功能不是在模型上定义的,而是由hooks npm动态生成的,该功能可启用pre/post middleware功能。
但是,您可以像这样 stub 保存在实例上:
page = new Page();
sinon.stub(page, 'save', function(cb){ cb(null) })
更新: stub pageModel
首先,您需要通过将
pageModel
设置为Page
(this.pageModel = xxx
)的自身属性来使其可访问。然后,您可以像下面所示的那样对它进行 stub :mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
mongoose.set('debug', true);
schema = new mongoose.Schema({title: String});
mongoose.model('Page', schema);
var Page = function(db) {
var mongoose = db || require('mongoose');
if(!this instanceof Page) {
return new Page(db);
}
var PageSchema = mongoose.model('Page');
this.pageModel = new PageSchema();
function save(params, cb) {
console.log("page.save");
this.pageModel.set(params);
this.pageModel.save(function (err, product) {
console.log("pageModel.save");
cb(err, product);
});
}
Page.prototype.save = save;
};
page = new Page();
sinon = require('sinon');
sinon.stub(page.pageModel, 'save', function(cb){
cb("fake error", null);
});
page.save({ title: 'awesome' }, function (err, product) {
if(err) return console.log("ERROR:", err);
console.log("DONE");
});
关于node.js - 使用Sinon对Mongoose模型进行 stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16727616/