0

0

如何在 Jest 测试中正确等待多个 role="alert" 元素出现

聖光之護

聖光之護

发布时间:2026-02-02 16:38:02

|

682人浏览过

|

来源于php中文网

原创

如何在 Jest 测试中正确等待多个 role=

使用 `screen.findallbyrole("alert")` 时,若目标元素是异步动态插入 dom(如 toast 组件),直接断言可能因渲染未完成而失败;需配合 `waitfor` 等待所有元素稳定存在。

在基于 DOM 的 Jest 测试中(例如使用 @testing-library/dom),findAllBy* 系列查询方法虽自带一定重试机制(默认约 1000ms 轮询),但其行为依赖于 元素是否真正完成挂载并满足可访问性条件。对于 Toast 这类通过 JavaScript 动态创建、添加、甚至带 CSS 过渡或延迟移除的组件,DOM 更新往往存在微小延迟或异步队列,导致 findAllByRole("alert") 在首次调用时仅捕获到部分(甚至仅最后一个)元素。

你遇到的问题——点击 3 次按钮却只查到 1 个 role="alert" 元素——正是典型的时间竞态:测试执行速度远快于 Toast 的实际 DOM 插入节奏,findAllByRole 在超时前仅观察到最终残留的一个节点(可能是最后一个 toast 尚未被清理,而前两个已快速消失或尚未 commit)。

✅ 正确解法:使用 waitFor 显式等待断言成立
waitFor 会反复执行传入的回调函数(默认超时 1000ms),直到其内部 expect 通过,或超时抛错。它比 findAllBy* 更灵活,适合验证“数量达到 N”或“状态最终一致”等复合条件:

自由画布
自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

下载
import { screen, waitFor } from '@testing-library/dom';

test('3 toasts appear on 3 button clicks', async () => {
  const { user } = getExampleDom();
  const successBtn = screen.getByRole('button', { name: /Trigger success toast/i });

  for (let i = 0; i < 3; i++) {
    await user.click(successBtn); // 推荐 await click(userEvent v14+ 默认返回 Promise)
  }

  // ✅ 使用 waitFor 确保 3 个 alert 同时存在
  await waitFor(async () => {
    const alerts = await screen.findAllByRole('alert');
    expect(alerts).toHaveLength(3);
  });
});

⚠️ 注意事项:

  • waitFor 内部必须 await 异步查询(如 findAllByRole),否则会立即 resolve 导致断言失效;
  • 若 Toast 存在自动关闭逻辑(如 3s 后 remove()),请确保 waitFor 超时时间 > 单个 toast 生命周期,或在测试中临时禁用自动销毁(例如 mock setTimeout 或通过配置项关闭);
  • 避免在 waitFor 外层重复 await screen.findAllByRole(...) —— 它不保证返回全部历史节点,仅返回当前存在的匹配项;
  • 清理副作用:每个测试后应重置 DOM(如 document.body.innerHTML = '')并销毁 Toast 实例,防止状态污染后续测试(可在 afterEach 中统一处理)。

? 进阶建议:为 Toast 组件增加可预测的测试钩子,例如:

  • 添加 data-testid="toast" 或 data-state="visible" 属性;
  • 暴露 toast.count() 方法供断言;
  • 使用 jest.useFakeTimers() 控制自动关闭定时器,提升测试稳定性。

通过 waitFor + 异步断言,你就能可靠地验证动态 UI 的最终状态,让 Toast 测试真正具备确定性与可维护性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3429

2024.08.14

alert怎么实现换行
alert怎么实现换行

alert通过使用br标签来实现换行。更多关于alert相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

493

2023.11.07

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

19

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

6

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

1

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

2

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

1

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 26.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号