我有一个 React 组件,它使用 Promise 检索数据,然后在 promise 解析时调用setState
。然后,它使用更新的状态来更改呈现的内容。
在测试时,我使用测试库的findBy*
方法来等待渲染的组件使用来自 Promise 的内容进行更新:
await findByText("Failure details", { exact: false });
我的测试通过 - 它们正确地等待组件重新渲染。 但是,我在运行它们时收到这样的警告(我正在使用 Jest,但我认为这无关紧要(:
Warning: An update to MyComponent inside a test was not wrapped in act(...).
我在网上找到的与此相关的所有内容要么是关于使用useEffect
的组件,要么是关于包含对其中act
的显式调用的测试(我的没有(,我认为这里没有必要 - 我的测试本身并没有改变组件,除了它调用render
的事实。
简而言之,我的情况似乎比其他人写的更简单 - 我只是使用setState
和findBy*
查询,没有什么比这更复杂的了。
这个问题有没有同样简单的解决方案?
值得庆幸的是,解决方案很简单 - 将 React 和 React-DOM 升级到>= 16.9.0。我不必更改我的测试或组件。
16.9.0 包括 ACT 的异步版本。正如我所说,我不必明确使用它,但它显然是在幕后使用的,因为它解决了我的问题。