如何在未处理的承诺拒绝中测试抛出

How to test a throw in an unhandled promise rejection

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

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()
})

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

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

您的组件“视觉输出”不受您发出的请求结果的影响,因此如果您想坚持 RTL 思维模式,则没有什么可测试的。事实上,你是在尝试测试内部实现,而这正是 RTL 试图避免的。

如果您修改组件并使其显示某种 success/error 消息,那么您可以测试 promise 拒绝是否会触发错误消息。