Ism*_*rov 13 reactjs react-native react-testing-library
获取元素文本内容的方法有多种:getByText
vs findByText
vs queryByText
。
有时我对使用哪一个感到困惑。
我在反应本机中有以下示例:
it('should render children', () => {
const mockedChildComponentTxt = 'Children are rendered';
const { getByText, findByText, queryByText } = render(
<MyProvider>
<div>{mockedChildComponentTxt}</div>
</MyProvider>,
);
expect(queryByText(mockedChildComponentTxt)).toBeTruthy()
});
Run Code Online (Sandbox Code Playgroud)
queryByText
虽然getByText
失败了,但是findByText
有效。
debug()
导致:
<RNCSafeAreaView
onInsetsChange={[Function anonymous]}
style={
Object {
"flex": 1,
}
}
>
<div>
Children are rendered
</div>
</RNCSafeAreaView>
Run Code Online (Sandbox Code Playgroud)
为什么findByText
在上面的例子中可以工作,但是getByText
却queryByText
失败了?
Ahm*_*bai 14
findBy
查询返回一个承诺,该承诺在找到匹配元素时解析。如果没有元素匹配或者在 1000 毫秒的默认超时后找到多个匹配项,则承诺将被拒绝。如果您需要查找多个元素,请使用findAllBy
.
getBy
查询返回查询的第一个匹配节点,如果没有元素匹配或找到多个匹配,则抛出错误。如果您需要查找多个元素,请使用getAllBy
.
queryBy
查询返回查询的第一个匹配节点,如果没有元素匹配则返回 null。这对于断言不存在的元素很有用。如果找到多个匹配项,则会抛出此异常(queryAllBy
改为使用)。
在您的示例中,渲染的组件包含文本“Children are render”,但似乎它可能无法立即在 DOM 中可用。
元素有可能在渲染后异步添加到 DOM 中,这就是为什么getByText
无法queryByText
立即找到它。然而,findByText
它之所以有效,是因为它的异步特性会等待元素出现在 DOM 中
findBy
查询返回一个承诺,该承诺在找到匹配元素时解析。
当它找到该元素时,测试就通过了。
归档时间: |
|
查看次数: |
7782 次 |
最近记录: |