单元测试/用 sinon 模拟猫鼬模型

Unit testing / Mocking mongoose models with sinon

所以我有一个像这样的节点模块:

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 有关?感谢您的任何建议!

所以,我刚刚发现了proxyquirehttps://www.npmjs.com/package/proxyquire,就像天开了,照耀着我最辉煌的"ah ha"时刻。不再需要在尝试使用之前在 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 函数存根到 return 我可以控制的东西。然后我测试的其余部分只是调用模块函数并可以按预期进行断言。