如何抑制来自@testinglibrary/request的错误输出



我有一个类似这样的测试:

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并在测试后将其恢复。

Dan Abramov对此有详细的评论。最终解决方案的代码示例可以在这里找到

本评论中的一些重要引述:

问题

是什么发出这些警告

我们看到两个警告:

  • Error: Uncaught [...]
  • The above error occurred ...

第一个来自jsdom。第二个来自React。

和解决方案

如何选择退出jsdom警告

那些你不想看到的情况呢?在浏览器中,您可以通过在自定义error事件中调用preventDefault()来选择退出CCD_ 10对象上的处理程序。

如何选择退出React组件堆栈

如果错误本身被静音,我们将不会打印堆栈(如如上所述),并且通过误差边界来处理误差。

请参阅评论以了解更多详细信息

最新更新