【问题标题】:Unit testing / Mocking mongoose models with sinon单元测试/用 sinon 模拟猫鼬模型
【发布时间】:2017-04-26 11:42:40
【问题描述】:

所以我有一个节点模块,例如:

let mongoose = require('mongoose'),
  User = mongoose.model('User');

module.exports = (req, res, next) => {
  User.findById(req.user)
    .then(user => {
      req.body.user = user._id;
      req.body.company = user.company;
      next();
    }, err => {
      req.send(400, err);
    });
};

因此,在这种情况下,我想确保将正确的东西附加到req.body。那么,我将如何模拟 User 函数?我必须先加载模型,所以这段代码在调用mongoose.model 之前不会抛出错误,所以可能与实际存根全局require 有关?感谢您的任何建议!

【问题讨论】:

    标签: node.js mongodb mongoose mocha.js sinon


    【解决方案1】:

    所以,我刚刚发现了proxyquire https://www.npmjs.com/package/proxyquire,就好像天开了,一束光照耀着我,这是最光荣的“啊哈”时刻。不再需要在尝试使用之前在 mongoose 中加载模型!

    模拟猫鼬的代码类似于:

    const proxyquire = require('proxyquire'),
      expect = require('chai').expect,
      Promise = require('bluebird'),
      _ = require('lodash'),
      USERID = 'abc123',
      COMPANY = 'Bitwise',
      mongooseStub = {
        mongoose: {
          model: (name, schema) => ({
            findById: () => {
              return new Promise((resolve, reject) => {
                resolve({_id: USERID, company: COMPANY});
              });
            }
          })
        }
      },
      attachUser = proxyquire('../lib/users/attach-user', mongooseStub);
    

    这将有效地加载attach-user 模块,同时删除mongoose.model 函数以返回我可以控制的东西。然后我的测试的其余部分只是调用模块函数并可以按预期进行断言。

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2017-08-11
      • 2013-01-16
      • 2019-08-04
      • 2018-04-26
      相关资源
      最近更新 更多