6

我正在尝试存根此对象中使用的 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:应该包装对象的属性

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

4

3 回答 3

7

我已经分析了猫鼬的来源,但认为这是不可能的。模型上没有定义保存功能,而是由启用前/后中间件功能的hooks npm动态生成的。

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

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

更新:剔除 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");
});
于 2013-05-24T12:09:09.067 回答
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);

看看sinon-mongoose。您可以期望只有几行的链式方法(在 Mongoose 模型和文档上)(repo 上有工作示例)。

于 2015-11-13T16:26:26.313 回答
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)
})
于 2017-05-25T12:47:04.973 回答