我试图 stub 这个对象中使用的 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:尝试包装未定义的属性另存为函数

我也试过这个:
sinon.stub PageSchema.prototype, 'save'

然后我得到了错误:

类型错误:应该包装对象的属性

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

最佳答案

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

但是,您可以像这样 stub 保存在实例上:

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

更新: stub pageModel

首先,您需要通过将pageModel设置为Page(this.pageModel = xxx)的自身属性来使其可访问。然后,您可以像下面所示的那样对它进行 stub :
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");
});

关于node.js - 使用Sinon对Mongoose模型进行 stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16727616/

10-12 21:07