使用Sinon扼杀一个mongoose模型
我试图存根用于此对象的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;
使用这个问题的答案,我试过这样做:
mongoose = require 'mongoose' sinon.stub mongoose.Model, 'save'
但是我得到了错误:
TypeError:尝试将未定义的属性保存为函数
我也试过这个:
sinon.stub PageSchema.prototype, 'save'
然后我得到了错误:
TypeError:应该包装对象的属性
有人能帮忙吗? 我究竟做错了什么?
我已经分析mongoose的来源,不认为这是可能的。 保存函数没有在模型中定义,而是通过钩子npmdynamic生成,使前/后中间件function。
但是,你可以保存在像这样的实例:
page = new Page(); sinon.stub(page, 'save', function(cb){ cb(null) })
更新:stubbing out pageModel
首先,您需要将pageModel
设置为Page
( this.pageModel = xxx
)的属性来访问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"); });
我build议你使用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模型和文档上),只需要几行(回购中有工作示例)。
page = new Page(); sinon.stub(page, 'save', function(cb){ cb(null) })
以上代码已被弃用。
请尝试为您的存根添加假function,如下所示 –
sinon.stub(page, 'save').callsFake(function(cb){ // do your Fake code cb(null) })