react-testing-library - 屏幕与渲染查询

Era*_*hel 25 javascript reactjs react-testing-library

有两种使用查询的方法react-testing-library

您可以使用该render方法返回的查询:

import React from 'react'
import { render } from '@testing-library/react'

...

const { getByText } = render(<div>Foo</div>)

expect(getByText('Foo')).toBeInTheDocument()
Run Code Online (Sandbox Code Playgroud)

或者您可以使用该screen对象:

import React from 'react'
import { render, screen } from '@testing-library/react'

...

render(<div>Foo</div>)

expect(screen.getByText('Foo')).toBeInTheDocument()
Run Code Online (Sandbox Code Playgroud)

但是文档中没有说明哪一个是最好的选择以及为什么。

有人可以启发我吗?

rre*_*ase 35

react-testing-library作者Kent C. Dodds本人最新推荐的选项是使用screen.

使用 screen 的好处是您不再需要在添加/删除所需的查询时使渲染调用解构保持最新。你只需要输入屏幕。剩下的就交给编辑器的神奇自动完成功能吧。

唯一的例外是,如果您正在设置容器或 baseElement,您可能应该避免这样做(老实说,我无法再想到这些选项的合法用例,而且此时它们仅出于历史原因才存在)。

资料来源:https : //kentcdodds.com/blog/common-mistakes-with-react-testing-library#not-using-screen

  • 这部分的意思是什么?“在添加/删除所需的查询时保持渲染调用解构最新” (3认同)
  • 从讨论来看,渲染函数返回的对象似乎可能是特定于框架的,但“屏幕”对象将与框架无关,从而使您的测试在项目之间更具弹性和一致性。 (3认同)
  • @BradyDowling `render` 返回一个可以解构的对象,例如 `const { getByText } = render(&lt;MyComponent /&gt;)`。如果您想使用其他查询,则必须更新此解构对象:`const { getByText, getByLabelText } = render(&lt;MyComponent /&gt;)`。使用“screen”,所有方法都可以在对象本身上使用(“screen.getByText”、“screen.getByLabelText”等) (2认同)
  • @JoeyM-H `使用屏幕,所有方法都可以在对象本身上使用` 对于从渲染返回的组件来说,这似乎已经是正确的了。似乎您可以跳过渲染组件的解构并获得相同的好处,但我相信我错过了一些重要的东西。 (2认同)
  • @BradyDowling你是对的,但是使用全局导入的“screen”而不是每次都将“render()”的返回值分配给一个变量仍然不那么冗长,特别是如果你在其中编写大量测试的话一个文件。这是该功能的 PR,以及作者的详细解释 https://github.com/testing-library/dom-testing-library/pull/412 显然它也有助于避免其他一些边缘情况。 (2认同)

twi*_*wiz 10

screen由 提供@testing-library/dom,这@testing-library/react是建立在的基础上。使用这些screen方法时,它们将在 html<body>元素中进行查询,如文档中所述:

因为查询整个 document.body 很常见,DOM 测试库还导出一个 screen 对象,该对象包含预先绑定到 document.body 的每个查询

render()仅在@testing-library/react. 它返回一个类似于 的对象screen,默认情况下还将查询绑定到<body>. 默认情况下,几乎没有区别,但是您可以通过传入 options 来自定义其行为。

例如,您可以指定<body>要查询以外的元素,甚至可以提供自定义查询方法

要回答你的问题,哪个是最好的,我会说使用render()更好,因为options它更灵活,但引用文档

您通常不需要指定选项

不过,我更喜欢使用 提供的方法render(),因为如果您决定添加选项,则无需记住更改所有查询。