使用 Sinon 对 Mongoose 模型进行存根 [英] Stubbing a Mongoose model using Sinon

查看:24
本文介绍了使用 Sinon 对 Mongoose 模型进行存根的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试存根此对象中使用的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆