thi*_*ple 6 mongoose node.js sinon
我试图存根此对象中使用的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;
Run Code Online (Sandbox Code Playgroud)
使用这个问题的答案,我试过这样做:
mongoose = require 'mongoose'
sinon.stub mongoose.Model, 'save'
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
TypeError:尝试将undefined属性保存为函数
我也试过这个:
sinon.stub PageSchema.prototype, 'save'
Run Code Online (Sandbox Code Playgroud)
然后我得到了错误:
TypeError:应该包装对象的属性
有人能帮忙吗?我究竟做错了什么?
我已经分析了猫鼬的来源,并不认为这是可能的.保存功能没有在模型上定义,而是由钩子npm动态生成,它启用了前/后中间件功能.
但是,你可以像这样在实例上保存存根:
page = new Page();
sinon.stub(page, 'save', function(cb){ cb(null) })
Run Code Online (Sandbox Code Playgroud)
更新:删除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");
});
Run Code Online (Sandbox Code Playgroud)
我建议您使用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);
Run Code Online (Sandbox Code Playgroud)
看看sinon-mongoose.你可以只用几行来预测链式方法(在Mongoose模型和文档上)(repo上有工作示例).