能否用userEvent实现fireEvent.keyDown(document, {key: '/'})的功能?
解决React测试中userEvent.keyboard无法触发document键盘事件的问题
问题原因
fireEvent.keyDown(document, { key: '/' })是直接给document元素派发键盘事件,而userEvent.keyboard默认会将事件派发到当前拥有焦点的DOM元素上。如果测试环境中没有元素处于聚焦状态,键盘事件不会绑定到document,导致触发失败。
解决方案
方案1:指定键盘事件的目标元素
调用userEvent.keyboard时,通过第二个参数显式指定事件目标为document,和fireEvent的逻辑对齐:
await userEvent.keyboard('/', { target: document });
方案2:先让document关联元素获取焦点
如果全局键盘监听绑定在body上,可先让body获取焦点再触发键盘事件:
document.body.focus(); await userEvent.keyboard('/');
补充说明
userEvent.type确实无法直接作用于document,因为它是模拟用户输入文本的行为,必须作用于可输入元素(如input、textarea),所以这种场景下只能用userEvent.keyboard。- 调用
userEvent的异步方法时务必加上await,结合目标元素指定即可解决问题。
内容的提问来源于stack exchange,提问作者wyc
相关产品推荐
相关产品推荐

