如何测试未处理的承诺拒绝中的投掷

时间:2021-05-19 21:35:25

标签: javascript reactjs unit-testing jestjs react-testing-library

当我无法访问该承诺实例的引用时,如何测试异步函数是否在特定条件下引发错误?

const fakeRequest = Promise.reject();

function Component() {
  const click = async () => {
    await fakeRequest()
      .then(doStuff)
      .catch(error => {
        if (error.foo === true) {
          throw new Error('Error') // how do I test this?
        }

        return 'fallback';
      });
  };

  return (
    <button onClick={click}>hi</button>
  );
}

test('test', () => {
  render(<Component>)
  userEvent.click(screen.getByRole('button'))

  // ??
  await flushPromises()
  expect().throwError()
})

1 个答案:

答案 0 :(得分:1)

React-testing-library 提倡“像真实用户一样进行测试”,而留下内部实现。遵循这一原则,您应该始终触发用户交互,并对视觉事物(或真人会体验的事物)进行断言。

https://testing-library.com/docs/guiding-principles

您的组件“视觉输出”不受您发出请求的结果的影响,因此如果您想坚持 RTL 思维方式,则无需测试。实际上,您在这里尝试测试内部实现,而这正是 RTL 试图避免的。

如果您修改组件并使其显示某种成功/错误消息,那么您可以测试承诺拒绝是否触发了错误消息。

相关问题