使用Sinon对Mongoose模型进行存根

时间:2013-05-24 04:22:14

标签: node.js mongoose 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;

使用this question的答案,我尝试过这样做:

mongoose = require 'mongoose'
sinon.stub mongoose.Model, 'save'

但是我得到了错误:

TypeError:尝试将undefined属性保存为函数

我也试过这个:

sinon.stub PageSchema.prototype, 'save'

然后我收到了错误:

TypeError:应该包装对象的属性

任何人都可以帮忙吗?我做错了什么?

3 个答案:

答案 0 :(得分:7)

我已经分析了猫鼬的来源,并且不认为这是可能的。保存功能未在模型上定义,但由hooks npm动态生成,可启用pre/post middleware功能。

但是,你可以在这样的实例上保存存储:

page = new Page();
sinon.stub(page, 'save', function(cb){ cb(null) })

更新:删除pageModel

首先,您需要将pageModel设置为Pagethis.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)
})