【问题标题】:Unit test for asyn function inside sails controller where async function called independently在独立调用异步函数的 Sails 控制器中对异步函数进行单元测试
【发布时间】:2017-12-15 06:14:37
【问题描述】:
我有一个帆控制器,我正在做类似的事情:
...
function asynFunc(){
/* some logic */
}
module.exports = {
myFunc: function () {
// Call async function and return
asynFunc();
return true;
}
};
现在我想为 asynFunc 编写单元测试。我能够编写 myFunc 的单元测试,但不能编写 asynFunc(获取数据、验证数据)。
请告诉我:
- 如何模拟 asyncFunc
- 如何对 asynFunc 进行单元测试
【问题讨论】:
标签:
javascript
unit-testing
sails.js
sinon
【解决方案1】:
你真的需要测试私有函数吗?如果你有私有的,你测试其他方法时似乎可以测试它?
如果你真的需要测试它,你可以这样做:
我的模块.js
async function asyncFunc(){
/* some logic */
}
module.exports = {
myFunc: async function () {
// Call async function and return
await asyncFunc();
return true;
}
};
test.js
const rewire = require('rewire');
const myModule = rewire('./myModule');
describe('unit/myModule:', () => {
const revert = (obj) => {
obj.__revert__();
delete obj.__revert__;
};
it('asyncFunc', async () => {
const asyncFuncSpy = jasmine.createSpy();
asyncFuncSpy.__revert__ = myModule.__set__('asyncFunc', asyncFuncSpy);
const actual = await myModule.myFunc();
expect(actual).toBeThruthy();
expect(asyncFuncSpy).toHaveBeenCalled();
revert(asyncFuncSpy)
})
})
【解决方案2】:
在 99% 的情况下,这是对控制器的错误使用!将该功能包装到一个服务中并统一测试该服务。
// Controller
module.exports = {
myFunc: function () {
// Call async function and return
MyService.asynFunc();
return true;
}
};
// Service
module.exports = {
async : function asynFunc(){
/* some logic */
}
}