繁体   English   中英

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

How do you test for the non-existence of an element using jest and react-testing-library?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

getByTextgetByTestId等在react-testing-library抛出和错误,如果没有找到元素导致测试在expect函数触发之前失败。

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

8 个回复

来自DOM Testing-library Docs - Appearance and Disappearance

断言元素不存在

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

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

queryAll APIs 版本返回匹配节点的数组。 数组的长度对于在 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[]

查询方式

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

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

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

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

您必须使用 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();
  });
});

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

expect(() => getByText('your text')).toThrow('Unable to find an element');

您可以使用 react-native-testing-library "getAllByType" 然后检查组件是否为空。 优点是不用设置TestID,也应该和第三方组件一起工作

 it('should contain Customer component', () => {
    const component = render(<Details/>);
    const customerComponent = component.getAllByType(Customer);
    expect(customerComponent).not.toBeNull();
  });

另一种解决方案:您也可以使用try/catch

expect.assertions(1)
try {
    // if the element is found, the following expect will fail the test
    expect(getByTestId('your-test-id')).not.toBeVisible();
} catch (error) {
    // otherwise, the expect will throw, and the following expect will pass the test
    expect(true).toBeTruthy();
}
const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

expect(submitButton).not.toBeNull() // it exist

为我工作(如果你想使用 getByTestId):

expect(() => getByTestId('time-label')).toThrow()
2 如何使用 jest 和 react-testing-library 测试 react-toastify

我有一个带有某种形式的屏幕,在提交时,我使用 axios 将请求发送到后端。 成功收到响应后,我用 react-toastify 敬酒。 非常直接的屏幕。 但是,当我尝试使用 jest 和 react 测试库通过集成测试来测试这种行为时,我似乎无法让 Toast 出现在 DOM 上。 我有一个像这 ...

3 使用 jest 和 react-testing-library 测试反应上下文

我正在尝试为我的component App.js设置测试,该component App.js将context作为道具并返回一个提供者。 问题是当我尝试测试它时,我传递给它的上下文总是解析为未定义。 我在组件中放置了一个控制台日志,并在创建上下文和创建组件(应该接收上下文作为参数)之间放置一个控制台 ...

9 使用 react-testing-library 测试 useContext()

我想我找到了另一种使用useContext钩子测试组件的方法。 我看过一些教程,这些教程测试一个值是否可以从父上下文提供者成功传递给子组件,但没有找到有关更新上下文值的子组件的教程。 我的解决方案是将根父组件与提供程序一起呈现,因为状态最终在根父组件中更改,然后传递给提供程序,然后提供程序将其传递 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM