because it's the first role, while getByRole('checkbox') would not. However, getByRole('checkbox', { queryFallbacks: true }) would enable all fallback roles and therefore match the same element.
原因:By default, it's assumed that the first role of each element is supported, so only the first role can be queried. If you need to query an element by any of its fallback roles instead, you can use queryFallbacks: true.
默认了查找方式是 role 属性中第一个值去查找,如果也想要匹配后值就需要 queryFallbacks: true
RTL 包中如何进行元素定位?
getxxx
、queryxxx
、findxxxx
这三种查找方式,这三者都有不同的区别。getxxx
返回已查找到的元素未找到就抛错queryxxx
查找元素,没查到的元素返回 Null 不会抛错,一般用于判断元素不存在findxxx
异步的查找元素通过在其后缀
All
之后就会查找多个元素,如果没有使用在后缀All
的这种形式,查找元素存在多个的条件下就会抛出错误1. ByRole
ByRole
根据 role 属性来查找元素,该属性一般都是默认值比如<input type='checkout' role="checkout">
or<button role='button'>
关于更多的默认值请查看w3使用的方法有:
getByRole, queryByRole, getAllByRole, queryAllByRole, findByRole, findAllByRole
这里去介绍了
getByRole
的强大特性,通常可以使用getByRole
来代替getByText
使用。官方文档对于
ByRole
介绍了大量的细节,但是目前阶段在 jsx 结构中添加aria-*
这种的属性来测试组件大致上不太可能 也用不到。所以这里能够明确如何使用 getByRole 的使用方式就行。关于ARIA
规则详细介绍参考这篇文章这里介绍了一个例子 如果使用
getByRole('switch')
来去查找元素能够找到<div role="switch checkbox" />
但是如果通过getByRole('checkbox')
的方式来查找元素 检索不到默认了查找方式是 role 属性中第一个值去查找,如果也想要匹配后值就需要
queryFallbacks: true
简单看一下定义了那些参数
*ByRole的参数属性
2. ByLabelText
这里使用的方法有
getByLabelText, queryByLabelText, getAllByLabelText, queryAllByLabelText, findByLabelText, findAllByLabelText
这里看一下参数
这里说了它将会查找与
TextMatch
匹配的文字,然后找到与该标签关联的元素,使用方式
如果在查找过程中有一样的属性可以提供
selector
options 选择器就行选择
input
node 可以这样使用getByLabelText('Username', {selector: 'input'})
如果 label 中的
for
属性和 input 元素的id
属性不相等或者 for 属性与非表单元素的id 匹配那getByLabelText
就查找不到元素类似这种就能查到
这种就会匹配失败, 抛出错误
3. ByPlaceholderText
PlaceholderText
: 占位符方法有:
getByPlaceholderText, queryByPlaceholderText, getAllByPlaceholderText, queryAllByPlaceholderText, findByPlaceholderText, findAllByPlaceholderText
使用该类型的方法将会检索所有元素上的
placeholderText
属性,并返回匹配的文本
元素简单的看一下参数
使用方式:
ByText
终于到最关键的规则了...
来看一下有那些方法:
getByText, queryByText, getAllByText, queryAllByText, findByText, findAllByText
参数:
ByDisplayValue
使用的方法:
getByDisplayValue, queryByDisplayValue, getAllByDisplayValue, queryAllByDisplayValue, findByDisplayValue, findAllByDisplayValue
基本参数:
具体使用
对于
<select>
元素它会选择与给定值相同的<option>
节点这里有疑问,在 react 中直接使用
const { getByDisplayValue } = render(<MyComponent />)
的时候能够获取到 值但是如果使用 这样的方式 就获取不到对应的值
ByAltText
查找具有
Alt
属性的元素通常是 img 返回和文本
相匹配的元素ByTitle
ByTestId
特别的 API
within
: 一般使用const {getByTestId} = render(<Component/>)
来获取组件可以直接通过 dom 语法获取 dom 元素然后使用 within 包裹起来,就能使用查询函数比如getByText
参考文章 不看参考文章巨亏!!!【网上教程非常多但是良莠不齐,找这方面的教程且挑选出来就要耗费大量的时间和精力】
2.非常详细但英文版看着费劲【死啃】-RTL官方文档
3.非常推荐【入门必备】React Testing Library Tutorial
4.强烈建议读完所有测试代码-测试案例
5.【4的仓库看不下来先看这个】使用 React Testing Library 和 Jest 完成单元测试仓库地址