我正在尝试存根此对象中使用的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:尝试将undefined属性保存为函数
我也试过这个:
sinon.stub PageSchema.prototype, 'save'
然后我收到了错误:
TypeError:应该包装对象的属性
任何人都可以帮忙吗?我做错了什么?
答案 0 :(得分:7)
我已经分析了猫鼬的来源,并且不认为这是可能的。保存功能未在模型上定义,但由hooks npm动态生成,可启用pre/post middleware功能。
但是,你可以在这样的实例上保存存储:
page = new Page();
sinon.stub(page, 'save', function(cb){ cb(null) })
更新:删除pageModel
首先,您需要将pageModel
设置为Page
(this.pageModel = xxx
)的自有属性。然后,您可以如下所示将其存根:
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");
});
答案 1 :(得分:5)
我建议您使用mock
代替stub
,这将检查原始对象上确实存在的方法。
var page = new Page();
// If you are using callbacks, use yields so your callback will be called
sinon.mock(page)
.expects('save')
.yields(someError, someResult);
// If you are using Promises, use 'resolves' (using sinon-as-promised npm)
sinon.mock(page)
.expects('save')
.resolves(someResult);
看看sinon-mongoose。你可以只用几行来预测链式方法(在Mongoose模型和文档上都有)(在repo上有工作示例)。
答案 2 :(得分:0)
page = new Page();
sinon.stub(page, 'save', function(cb){ cb(null) })
以上代码已弃用。
请尝试为您的存根添加假功能,如下所示 -
sinon.stub(page, 'save').callsFake(function(cb){
// do your Fake code
cb(null)
})