当我无法访问该承诺实例的引用时,如何测试异步函数是否在特定条件下引发错误?
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()
})
答案 0 :(得分:1)
React-testing-library 提倡“像真实用户一样进行测试”,而留下内部实现。遵循这一原则,您应该始终触发用户交互,并对视觉事物(或真人会体验的事物)进行断言。
https://testing-library.com/docs/guiding-principles
您的组件“视觉输出”不受您发出请求的结果的影响,因此如果您想坚持 RTL 思维方式,则无需测试。实际上,您在这里尝试测试内部实现,而这正是 RTL 试图避免的。
如果您修改组件并使其显示某种成功/错误消息,那么您可以测试承诺拒绝是否触发了错误消息。