你如何使用 jest 和 react-testing-library 测试元素的不存在?

IT技术 reactjs jestjs react-testing-library
2021-04-07 10:51:25

我有一个组件库,我正在为使用 Jest 和 react-testing-library 编写单元测试。基于某些props或事件,我想验证某些元素没有被渲染。

getByText, getByTestId, 等react-testing-library如果在expect函数触发之前未找到导致测试失败的元素则会抛出并出错

你如何使用 react-testing-library 测试玩笑中不存在的东西?

6个回答

来自DOM Testing-library Docs - Appearance and Disappearance

断言元素不存在

标准getBy方法在找不到元素时会抛出错误,因此如果您想断言某个元素存在于 DOM 中,您可以改用queryByAPI:

const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

queryAllAPI的版本返回匹配节点的数组。数组的长度对于在 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()
几天前发布了新的文档站点。我应该使用更永久的链接。感谢更新@pbre!
2021-05-23 10:51:25
queryByText对于那些谁想要就相当于getByText是空安全
2021-05-29 10:51:25
我相信上面的链接是为了指向react-testing-library 文档
2021-06-07 10:51:25
2021-06-07 10:51:25
我的坏 kentcddodds,谢谢。我使用getByTestId并得到了同样的错误。而且,我没有检查常见问题解答,抱歉。很棒的图书馆!你能修改你的答案以包含 `.toBeNull();
2021-06-10 10:51:25

使用queryBy/ queryAllBy

正如你所说,如果什么也没找到getBy*,就会getAllBy*抛出一个错误。

但是,等效的方法queryBy*queryAllBy*而是返回nullor []

查询方式

queryBy*查询返回查询的第一个匹配节点,null如果没有元素匹配则返回这对于断言不存在的元素很有用。如果找到多个匹配项(使用 queryAllBy 代替),则会抛出此问题。

queryAllBy queryAllBy*查询返回查询的所有匹配节点的数组,[]如果没有元素匹配,则返回空数组 ( )。

https://testing-library.com/docs/dom-testing-library/api-queries#queryby

因此,对于您提到的特定两个,您可以使用queryByTextand queryByTestId,但这些适用于所有查询,而不仅仅是这两个。

感谢您的客气话!这与接受的答案的功能基本相同,因此我认为它不是较新的 API(但我可能是错的)。这个答案和接受的答案之间唯一真正的区别是,接受的答案说只有方法可以做到这一点(queryByTestId),而实际上有两套完整的方法,其中queryByTestId一个具体例子。
2021-05-28 10:51:25
谢谢你这么详细的解释。这是一个如此微妙的差异,尽管在此处查看了他们的示例,但我还是没有看到它:github.com/testing-library/jest-dom#tobeinthedocument :face-palm:
2021-05-28 10:51:25
这比接受的答案要好得多。这个 API 是新的吗?
2021-05-30 10:51:25
谢谢我更喜欢这个而不是设置测试ID
2021-06-19 10:51:25

getBy* 在找不到元素时抛出错误,因此您可以检查它

expect(() => getByText('your text')).toThrow('Unable to find an element');
这可能非常容易出错。错误抛出用于调试目的而不是用于验证。
2021-05-24 10:51:25

您必须使用 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