使用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设置为Pagethis.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) })