2016-12-11 51 views
0

所以我有一个节点模块,如:单元测试/惩戒猫鼬型号兴农

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

回答

0

所以,我刚刚发现了proxyquirehttps://www.npmjs.com/package/proxyquire它就像天堂一般,为我最辉煌的“啊哈”时刻开启了光芒。在尝试使用它们之前,不再需要在猫鼬中加载模型!

以模拟猫鼬的代码看起来是这样的:

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函数返回的东西我可以控制的。然后,我的测试的其余部分只是调用模块函数,并可以按预期做出断言。