单元测试/用 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
有关?感谢您的任何建议!
所以,我刚刚发现了proxyquire
https://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 我可以控制的东西。然后我测试的其余部分只是调用模块函数并可以按预期进行断言。
所以我有一个像这样的节点模块:
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
有关?感谢您的任何建议!
所以,我刚刚发现了proxyquire
https://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 我可以控制的东西。然后我测试的其余部分只是调用模块函数并可以按预期进行断言。