【问题标题】:Async callback timeout when unit testing nested async function单元测试嵌套异步函数时的异步回调超时
【发布时间】:2020-06-11 17:57:24
【问题描述】:

我想实现一个异步访问一些 api 并进行一些计算的函数。但是我想使用 Promise(也因为我认为为它们编写单元测试很容易)

这是我要写的函数。

const CalcFactory = (someApi1, someApi2, someApi3) => 
 async function calculation(params){
  return new Promise((res, rej) =>{
    const data1 = someApi1.getData() // getData is async
    someApi2.getData((err, data) =>{
       if(err)
         rej(err);
       else
         res();
      });
    });
 }

现在的问题是如何测试和模拟这个?我的第一个测试是是否所有的 api 方法都被调用了,但我已经为此苦苦挣扎了。

const Calculator = CalcFactory(api1Mock, api2Mock, api3Mock);

if('should hit all external apis', () => {
return Calculator(somedada).then(()=>{
   expect(api1Mock.getData).toHaveBeenCalledWith(someData);
   expect(api2Mock.getData).toHaveBeenCalledWith(somedata);
   });

});

模拟看起来像这样:

const api1Mock = {
   someData: jest.fn(),
}

const api2Mock = {
someData: jest.fn().mockResolvedValue({
      data:{},
   })
}

但是,当我运行测试时,我总是会超时。我也不确定这是否是编写函数的好方法,但我真的很想使用 Promise。

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案1】:

    getData 在一个地方,someData 在另一个地方。考虑到承诺没有被拒绝,这不是问题。 Calculator(somedada) promise 未解决,因为 someApi2.getData 被错误地模拟并导致待处理的 promise。

    不使用awaitasync 函数返回promise 是一种反模式。这意味着要么它没有从async 中受益,要么promise 构造函数除了promisfation of non-promise API 之外包含太多。

    如果使用async 是合理的,它可以是:

    async function calculation(params){
      ...
      const data1 = someApi1.getData()
      const data2 = await new Promise((res, rej) =>{
          someApi2.getData((err, data) => {
           if(err)
             rej(err);
           else
             res();
          });
      });
      ...
    }
    

    在 Node 中,可以使用 util.promisify 承诺错误优先回调。

    嘲笑someApi2.getData 应该像预期的那样使用回调:

    const api2Mock = {
      getData: jest.fn().mockImplementation(cb => cb(null, 'data'))
    }
    

    如果someApi2.getData 被多次使用,那么promisify 是有意义的,而不是每次都使用promise 构造函数。

    【讨论】:

    • 谢谢,我答应了someApi2.getData 并等待它工作正常的承诺。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多