我有一个类似这样的测试:
it('should fail when no provider specified', async () => {
expect(() => render(<TestComponent />)).toThrow('Some error');
});
测试成功是因为CCD_ 1确实抛出错误。但是,输出也有错误
错误:未捕获〔错误:某些错误〕
如何"捕获";或者以其他方式正确测试上述TestComponent
的错误?
**编辑**
我目前正在通过替换console.error
:来解决这个问题
const __logError = console.error;
console.error = () => {};
expect(() => render(<TestComponent />)).toThrow('Some error');
console.error = __logError;
然而,这个解决方案似乎很笨拙。有干净的方法吗?
**编辑**
我更改了TestComponent
的实现,这样它就可以捕获错误而不是抛出,但测试库仍然有错误输出。
以下是实现:
class TestComponent extends Component {
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
constructor() {
super();
this.state = {
hasError: false,
error: null
};
}
componentDidCatch(error, errorInfo) {
//console.error(error, errorInfo);
this.setState(prevState => ({ ...prevState, error, hasError: true }));
}
render() {
return this.state.hasError ? (
<div data-testid="test">{ this.state.error.message }</div>
) : (
<SomeOtherComponentThrowingErrors />
);
}
};
我把测试用例改为:
await act(async () => {
render(<TestComponent />);
});
expect(screen.getByTestId('test')).toHaveTextContent('Some error');
测试成功了(就像以前一样),但是仍然有错误输出。
同样,我可以抑制输出的唯一方法是替换console.error
并在测试后将其恢复。
本评论中的一些重要引述:
问题
是什么发出这些警告
我们看到两个警告:
Error: Uncaught [...]
The above error occurred ...
第一个来自jsdom。第二个来自React。
和解决方案
如何选择退出jsdom警告
那些你不想看到的情况呢?在浏览器中,您可以通过在自定义
error
事件中调用preventDefault()
来选择退出CCD_ 10对象上的处理程序。
如何选择退出React组件堆栈
如果错误本身被静音,我们将不会打印堆栈(如如上所述),并且通过误差边界来处理误差。
请参阅评论以了解更多详细信息