扫码关注官方订阅号
正文
0
霞舞
发布时间:2025-10-11 13:43:13
1026人浏览过
来源于php中文网
原创
在前端应用开发中,下拉框是常见的ui组件,其测试对于确保用户交互的正确性至关重要。react testing library (rtl) 旨在模拟用户行为,并鼓励开发者测试组件的最终用户可访问状态。然而,在测试元素时,开发者常会遇到一些困惑,尤其是在验证选项是否被正确选中时。
一个常见的误区是试图通过检查DOM元素的HTML属性(如hasAttribute('selected'))来判断一个是否被选中。在某些情况下,DOM的selected属性可能不会被动态更新,或者其存在与否并不能完全代表选项的实际选中状态。正确的做法是检查DOM元素的JavaScript属性,例如optionElement.selected,它能更准确地反映元素的当前状态。
在尝试测试下拉框时,开发者可能会尝试以下方法,但这些方法往往会导致测试失败或产生误导性结果:
import React from "react"; import { render } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; test("Can Select Item - Incorrect Assertion", async () => { const user = userEvent.setup(); const screen = render( Hey There ); await user.selectOptions(screen.getByTestId("test"), "Hey"); // 错误示范:检查hasAttribute('selected')可能无法反映真实状态 expect(screen.getByTestId("Hey").hasAttribute("selected")).toBeTruthy(); });
上述测试中,即使userEvent.selectOptions成功触发了选择事件,screen.getByTestId("Hey").hasAttribute("selected")也可能返回false,导致测试失败。这是因为selected HTML属性在某些浏览器或测试环境中可能不会被DOM动态添加或移除,而JavaScript的selected属性才是可靠的指示器。
类似地,直接使用fireEvent.select来触发选择事件,然后检查HTML属性也会遇到同样的问题:
import React from "react"; import { fireEvent, render } from "@testing-library/react"; test("Can Select Item with fireEvent - Incorrect Assertion", async () => { const screen = render( Hey There ); fireEvent.select(screen.getByTestId("test"), { target: { value: "1" } }); // 错误示范:同样是检查hasAttribute('selected') expect(screen.getByTestId("Hey").hasAttribute("selected")).toBeTruthy(); });
尽管fireEvent.select成功模拟了选择事件,hasAttribute("selected")的检查依然是不可靠的,因为它依赖于HTML属性而非元素的实际JavaScript状态。
一个AI登陆页面自动构建器
要正确测试下拉框的选择行为,核心在于两点:
以下是实现这一目标的推荐方法:
import React from "react"; import { fireEvent, render } from "@testing-library/react"; // 定义一个接口,用于更清晰地表示选项的状态 export interface KeyValuePair { value: string; selected: boolean; } it("should correctly set selected option in a dropdown", () => { // 渲染包含select和option元素的组件 const { getByTestId, getAllByTestId } = render( Test option selects {/* 默认选项,无value */} Hey There ); // 1. 模拟用户选择事件 // 使用 fireEvent.select 触发 select 元素的 change 事件 // target.value 应设置为要选中的 option 的 value fireEvent.select(getByTestId("select"), { target: { value: "1" } }); // 2. 获取所有 option 元素并检查其选中状态 // getAllByTestId 返回一个数组,确保获取所有具有相同 data-testid 的元素 let options = getAllByTestId("select-option") as HTMLOptionElement[]; // 3. 过滤出所有被选中的 option const values = options .map( (e) => ({ value: e.value, selected: e.selected, // 关键:检查 option 元素的 JavaScript 'selected' 属性 } as KeyValuePair) ) .filter((x) => x.selected); // 4. 执行断言 // 确保只有一个选项被选中 expect(values).toHaveLength(1); // 确保被选中的选项的 value 是我们期望的 expect(values[0].value).toBe("1"); });
在React Testing Library中测试下拉框时,请记住以下关键点:
遵循这些指南,你将能够编写出更稳定、更准确的React Testing Library测试,确保你的组件按预期工作。
相关文章
React Router 6 中实现多路径共享同一布局的正确方式
javascript怎样进行单元测试_Jest框架如何使用【教程】
如何在 React 前端项目中安全使用 MinIO
javascript框架是什么_为什么需要学习Vue或React【教程】
javascript服务端渲染如何实现_node.js中怎样渲染前端页面【教程】
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
如何在 Go 中从 Redis 列表类型键安全获取所有元素
2026-01-29 15:45
Remix Logic 现已推出DLSS 加速 Half Sword、Highguard、《噬血代码 II》(CODE VEIN II) ARC Raiders:Headwinds 更新
Minecraft源码中IN_FIRE与ON_FIRE伤害源的区别解析
2026-01-29 16:04
iPhone 18 Pro能直连星链:苹果史上首次
2026-01-29 16:16
如何在 ES6 中遍历对象内部的多个数组
2026-01-29 16:26
如何在多个 C 模块中复用 Go 导出的回调函数
2026-01-29 16:49
皓衣行原著小说叫什么
Tone.js 序列进度与状态监控完整指南
2026-01-29 17:15
目标地图怎么开会员-目标地图会员开通方法
2026-01-29 17:38
任天堂邀请多位记者赴纽约 大型直面会或将揭晓
2026-01-29 17:40
热门AI工具
幻方量化公司旗下的开源大模型平台
字节跳动自主研发的一系列大型语言模型
阿里巴巴推出的全能AI助手
腾讯混元平台推出的AI助手
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
一站式AI创作平台,免费AI图片和视频生成。
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
相关专题
dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。
3342
2024.08.14
本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。
2
2026.01.29
本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。
本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。
本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。
本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。
3
Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。
25
clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。
16
本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。
8
热门下载
相关下载
精品课程
共58课时 | 4.3万人学习
共12课时 | 1.0万人学习
共12课时 | 1万人学习
共6课时 | 11.2万人学习
共79课时 | 151.7万人学习
共6课时 | 53.4万人学习
共4课时 | 22.4万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部