使用 Sinon 对 Mongoose 模型进行存根 [英] Stubbing a Mongoose model using Sinon
问题描述
我正在尝试存根此对象中使用的 mongoose 依赖项:
I am trying to stub the mongoose dependency used in this object:
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: 应该包装对象的属性
有人可以帮忙吗?我做错了什么?
Can anyone help with this? What am I doing wrong?
推荐答案
我已经分析了 mongoose 源,但认为这是不可能的.保存函数不是在模型上定义的,而是由 hooks npm 动态生成的,它启用了 前/后中间件功能.
I've analysed mongoose source and don't think this is possible. Save function is not defined on model, but dynamically generated by hooks npm which enables pre/post middleware functionality.
但是,您可以像这样保存实例:
However, you can stub save on instance like this:
page = new Page();
sinon.stub(page, 'save', function(cb){ cb(null) })
<小时>
更新:剔除 pageModel
UPDATE: Stubbing out pageModel
首先,您需要通过将 pageModel
设置为 Page
自己的属性(this.pageModel = xxx
)来使其可访问.然后,您可以像下面所示那样存根:
First, you need to make pageModel
accessible by setting it as own property of Page
(this.pageModel = xxx
). Then, you can stub it like shown bellow:
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");
});
这篇关于使用 Sinon 对 Mongoose 模型进行存根的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!