使用Sinon对Mongoose模型进行存根

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:应该包装对象的属性

有人能帮忙吗?我究竟做错了什么?

Mil*_*vic 7

我已经分析了猫鼬的来源,并不认为这是可能的.保存功能没有在模型上定义,而是由钩子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)


Gon*_*Gon 6

我建议您使用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上有工作示例).