当前位置: 首页 > article >正文

使用@test-library/react的screen中的方法和直接使用getByText,getByTestId等的区别?

在 React Testing Library 中,screen 对象和直接使用 getByText, getByTestId 等方法之间的主要区别在于它们的使用方式和上下文。然而,从功能的角度来看,它们实际上是相互关联的,因为 screen 对象提供了一组封装好的查询方法,这些方法内部最终会调用如 getByText, getByTestId 等查询函数。

直接使用 getByText, getByTestId

当你直接调用 getByText, getByTestId 等方法时,你通常是在组件的渲染结果(即 DOM)上直接进行查询。这些方法是由 React Testing Library 提供的,用于从渲染的组件树中查找元素。如果找不到匹配的元素,这些方法会抛出一个错误。

例如:

import { render, getByText } from '@testing-library/react';

const { container } = render(<MyComponent />);
const element = getByText(container, 'some text'); // 注意:这里的用法实际上是不推荐的,因为 getByText 应该直接通过 render 的结果调用

但更常见的做法是直接从 render 函数的返回结果中调用这些方法,或者通过 screen 对象调用,如下所示:

import { render, screen } from '@testing-library/react';

render(<MyComponent />);
const element = screen.getByText('some text'); // 推荐的方式

使用 screen 对象

screen 对象是一个全局查询助手,它允许你在整个 DOM 中进行查询,而无需担心当前的渲染上下文。这在你需要查询不在当前组件直接作用域内的元素时特别有用,比如模态框、下拉菜单等。

screen 对象提供了一组与 getBy* 类似的方法,如 screen.getByText, screen.getByTestId, screen.getByRole 等。使用这些方法时,你不需要指定一个特定的容器元素,因为 screen 已经代表了整个 DOM。

区别总结

  • 使用上下文:直接使用 getByText 等方法时,你可能需要指定一个容器元素(尽管在大多数情况下,你会从 render 函数的返回结果中直接调用它们)。而 screen 对象则不需要,因为它已经代表了整个 DOM。
  • 全局性screen 对象提供了一种全局查询的方式,这在某些情况下非常有用,比如当你需要查询不在当前组件作用域内的元素时。
  • 推荐做法:虽然你可以直接调用 getByText 等方法,但使用 screen 对象进行全局查询是 React Testing Library 推荐的做法,因为它更符合库的设计哲学和最佳实践。

注意:在 React Testing Library 的较新版本中,直接从 render 函数的返回结果中调用 getByText 等方法(如上例中的第一个示例)可能不是最佳实践,因为 render 函数现在通常只返回一个包含 containerbaseElement 的对象,而不是直接提供查询方法。因此,你应该使用 screen 对象或 render 函数的返回结果中的 containerbaseElement(如果需要的话)来调用查询方法。然而,对于大多数用例来说,screen 对象提供了更简洁和全局的查询方式。


http://www.kler.cn/a/299736.html

相关文章:

  • 一文讲解Java中的BIO、NIO、AIO之间的区别
  • SSM-MyBatis-总结
  • 中间件安全
  • 21.2-工程中添加FreeRTOS(掌握) 用STM32CubeMX添加FreeRTOS
  • Spring AI 在微服务中的应用:支持分布式 AI 推理
  • HDFS安全模式
  • 面试题—Java基础
  • 计算机网络 ---- 电路交换、报文交换、分组交换性能分析
  • 校园安全无小事,EasyCVR视频综合管理平台助力智慧校园视频监控系统全面升级
  • 二层交换机如何工作
  • 点亮第一盏LED灯,认识stm32最小系统板
  • 【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI
  • 使用libmpeg解码mp3格式文件
  • OPPO 全家桶:Find X8/Pro、Pad3 Pro与Enco X3即将10月登场
  • OpenCV-模板匹配
  • 要在 Windows 系统中通过 VNC 远程连接到 CentOS 或 Ubuntu 服务器,可以按照以下步骤来配置和使用 VNC 进行远程桌面访问
  • MySQL——数据库的高级操作(一)数据备份与还原(1)数据的备份
  • 科技改变生活,IsMyLcdOK引领屏幕检测新风尚
  • Unity解析XML开发随机名字生成模块
  • SAP学习笔记 - 开发04 - Fiori UI5 开发环境搭建
  • Word文档格式设置的自动化与技巧
  • Apache SeaTunnel基础介绍
  • 南通网站建设手机版网页
  • Ajax实现一个简单的文件上传进度条
  • Python中`enumerate()`函数的作用
  • Imagination推出性能最高且具有高等级功能安全性的汽车GPU IP