我有一个帆控制器,我正在做类似的事情:
...
function asynFunc(){
/* some logic */
}
module.exports = {
myFunc: function () {
// Call async function and return
asynFunc();
return true;
}
};
现在,我想为asynfunc编写单元测试。我能够编写myFunc的单元测试,但不是asynfunc(获取数据,验证数据)。
请让我知道:
- 我如何模拟Asyncfunc
- 我如何单位测试asynfunc
您真的需要测试私人功能吗?如果您有私有的情况,似乎您可以在测试其他方法时对其进行测试?
如果您确实需要测试,则可以执行以下操作:mymodule.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)
})
})
这在99%的情况下对控制器的使用不良!将该功能包装到服务和团结测试服务。
// Controller
module.exports = {
myFunc: function () {
// Call async function and return
MyService.asynFunc();
return true;
}
};
// Service
module.exports = {
async : function asynFunc(){
/* some logic */
}
}