【问题标题】:Unable to get response from Jest test for an async-await-try-catch function无法从 Jest 测试中获得对 async-await-try-catch 函数的响应
【发布时间】:2019-09-15 21:47:58
【问题描述】:

我正在为使用 try-catch 样式语法的 async-await 函数编写一个简单的笑话测试;

很遗憾,该函数没有返回响应;我知道我错过了一些非常愚蠢的东西。我可以多用一双眼睛。

PS:大多数 Internet 资源都关注普通的 async-await,但很少关注 async-await-try-catch;因此询问SO。

async justAnotherAsyncAwait () {
    try {
        console.log(`inside async await`);
        return Promise.resolve('HIIII');
    } catch (error) {
        return Promise.reject(error);
    }
}

expect(justAnotherAsyncAwait()).resolves.toEqual('HIIII')

控制台读取inside async-await

【问题讨论】:

  • 我认为您在返回 Promise 结果之前缺少等待。等待 Promise 解决后即可返回。
  • 这篇文章可能对blog.grossman.io/…有帮助
  • @RinkeshGolwala 似乎不起作用;除了 await-to-js 之外,还有没有原生的方式来处理这个???

标签: javascript unit-testing ecmascript-6 async-await jestjs


【解决方案1】:

resolvesrejects 都要求您返回 Promise

test('justAnotherAsyncAwait', () => {
  // return the Promise
  return expect(justAnotherAsyncAwait()).resolves.toBe('HIIII');  // Success!
});

...或使用async 测试函数并在Promise 上调用await

test('justAnotherAsyncAwait', async () => {  // <= async test function
  // await the Promise
  await expect(justAnotherAsyncAwait()).resolves.toBe('HIIII');  // Success!
});

另一个注意事项:

async 函数 总是 返回一个 Promise 并且它返回的 Promise 将解析为返回值,或者如果抛出 Error 则以 Error 拒绝,所以您通常不需要在 async 函数体中使用 try / catch

这是一个简单的例子:

const func = async (arg) => {
  if (arg === 'pass') {
    return 'HIIII';
  }
  throw new Error('something bad happened');
}

test('justAnotherAsyncAwait', async () => {
  await expect(func('pass')).resolves.toBe('HIIII');  // Success!
  await expect(func()).rejects.toThrow('something bad happened');  // Success!
});

【讨论】:

  • 当函数本身是类成员时,我在使用此方法时遇到问题,因此没有将其作为变量引用,因此我将其包装在匿名函数中,但服务器之前一直退出await expect 调用完成。
【解决方案2】:
const justAnotherAsyncAwait = async () => {
    try {
        console.log(`inside async await`);
        return  await Promise.resolve('HIIII');
    } catch (error) {
        return Promise.reject(error);
    }
}

describe('simple async await test', () => {
  it('resolve HIIII', () => {
    expect(justAnotherAsyncAwait()).resolves.toEqual('HIIII')
  });
});

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2017-09-09
    • 2019-08-08
    • 2019-03-14
    • 2021-08-28
    相关资源
    最近更新 更多