ASYN功能在SAILS Controller中的单位测试,其中异步函数独立调用



我有一个帆控制器,我正在做类似的事情:

...
function asynFunc(){
/* some logic */
} 
module.exports = {
    myFunc: function () {
     // Call async function and return
     asynFunc();
     return true;
    }
};

现在,我想为asynfunc编写单元测试。我能够编写myFunc的单元测试,但不是asynfunc(获取数据,验证数据)。

请让我知道:

  1. 我如何模拟Asyncfunc
  2. 我如何单位测试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 */
    }
}

最新更新