You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部分包裹act的userEvents触发「当前测试环境不支持act」警告

关于React Testing Library中act()与user-event方法的疑问解答

核心结论

你完全不需要手动用act()包裹user-event的任何方法,包括user.keyboard()、user.hover()这类操作——Testing Library系列工具(包括user-event)已经内置了act()的处理逻辑,会自动确保所有React状态更新都被正确包裹,符合React的测试要求。

为什么两种操作表现不同?

  • 对于user.keyboard("{Enter}"):这个操作的内部逻辑已经正确处理了act包裹,且操作本身没有触发延迟的异步更新(比如动画帧级别的状态变更),所以手动包act不会触发警告,但这属于多余操作。
  • 对于user.hover()的情况:报错栈显示,hover操作触发了react-window组件的setState,而这个更新是通过动画帧(requestAnimationFrame)延迟执行的。你手动包裹act()时,和user-event内部的act处理、以及jsdom对动画帧的模拟逻辑产生了冲突,导致React抛出“当前环境不支持act”的警告。

移除act()后会不会导致测试误报?

不会。user-event的所有交互方法都设计为自动处理React的更新流程,确保测试执行时所有状态变更都被act捕获,测试结果是可靠的。你移除act()后测试通过,说明测试逻辑本身是正确的,之前的警告反而因为手动多包act导致的。

正确的代码写法

把触发警告的代码改成:

await user.hover(await screen.findByLabelText("connection-target"))

额外提示

以后遇到类似的act()警告,先检查是不是自己手动额外包裹了act。Testing Library的查询方法(findBy*、getBy*等)和user-event的交互方法,都已经帮你处理好了act的逻辑,手动包裹反而容易引发冲突。

内容的提问来源于stack exchange,提问作者timhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:07:20