我有一个组件库,我正在为使用 Jest 和 react-testing-library 编写单元测试。基于某些props或事件,我想验证某些元素没有被渲染。
getByText
, getByTestId
, 等react-testing-library
如果在expect
函数触发之前未找到导致测试失败的元素,则会抛出并出错。
你如何使用 react-testing-library 测试玩笑中不存在的东西?
我有一个组件库,我正在为使用 Jest 和 react-testing-library 编写单元测试。基于某些props或事件,我想验证某些元素没有被渲染。
getByText
, getByTestId
, 等react-testing-library
如果在expect
函数触发之前未找到导致测试失败的元素,则会抛出并出错。
你如何使用 react-testing-library 测试玩笑中不存在的东西?
来自DOM Testing-library Docs - Appearance and Disappearance
断言元素不存在
标准
getBy
方法在找不到元素时会抛出错误,因此如果您想断言某个元素不存在于 DOM 中,您可以改用queryBy
API:const submitButton = screen.queryByText('submit') expect(submitButton).toBeNull() // it doesn't exist
该
queryAll
API的版本返回匹配节点的数组。数组的长度对于在 DOM 中添加或删除元素后的断言很有用。const submitButtons = screen.queryAllByText('submit') expect(submitButtons).toHaveLength(2) // expect 2 elements
not.toBeInTheDocument
该
jest-dom
实用程序库提供了.toBeInTheDocument()
匹配器,其可被用来断言一个元件是在文档或不的身体。这比断言查询结果更有意义null
。import '@testing-library/jest-dom/extend-expect' // use `queryBy` to avoid throwing an error with `getBy` const submitButton = screen.queryByText('submit') expect(submitButton).not.toBeInTheDocument()
使用queryBy
/ queryAllBy
。
正如你所说,如果什么也没找到getBy*
,就会getAllBy*
抛出一个错误。
但是,等效的方法queryBy*
和queryAllBy*
而是返回null
or []
:
查询方式
queryBy*
查询返回查询的第一个匹配节点,null
如果没有元素匹配则返回。这对于断言不存在的元素很有用。如果找到多个匹配项(使用 queryAllBy 代替),则会抛出此问题。queryAllBy
queryAllBy*
查询返回查询的所有匹配节点的数组,[]
如果没有元素匹配,则返回空数组 ( )。
https://testing-library.com/docs/dom-testing-library/api-queries#queryby
因此,对于您提到的特定两个,您可以使用queryByText
and queryByTestId
,但这些适用于所有查询,而不仅仅是这两个。
getBy* 在找不到元素时抛出错误,因此您可以检查它
expect(() => getByText('your text')).toThrow('Unable to find an element');
您必须使用 queryByTestId 而不是 getByTestId。
这是一个代码示例,我想在其中测试具有“car” id 的组件是否不存在。
describe('And there is no car', () => {
it('Should not display car mark', () => {
const props = {
...defaultProps,
base: null,
}
const { queryByTestId } = render(
<IntlProvider locale="fr" messages={fr}>
<CarContainer{...props} />
</IntlProvider>,
);
expect(queryByTestId(/car/)).toBeNull();
});
});
const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist
expect(submitButton).not.toBeNull() // it exist