为什么我们必须在测试库中使用 toBeInTheDocument

Bra*_*ven 4 reactjs jestjs react-dom testing-library

在测试库文档的某些页面上出现了使用 screen.getByText 的示例:

  expect(screen.getByText(/you are home/i)).toBeInTheDocument()
Run Code Online (Sandbox Code Playgroud)

关联

我的问题是这与此有何不同:

  screen.getByText(/you are home/i)
Run Code Online (Sandbox Code Playgroud)

为什么当 screen.getByText 执行相同操作时文档使用 .toBeInTheDocument() (当“you are home”文本不在文档中时抛出错误)?这不是多余的吗?

jse*_*ksn 5

这不是必需的,但有些人认为这有助于更清楚地传达意图。

\n
\n

来自博客文章React 测试库的常见错误(由原始贡献者 Kent 撰写):

\n
\n

使用get*变体作为断言

\n
\n

重要性:低

\n
\n
// \xe2\x9d\x8c\nscreen.getByRole(\'alert\', {name: /error/i})\n\n// \xe2\x9c\x85\nexpect(screen.getByRole(\'alert\', {name: /error/i})).toBeInTheDocument()\n
Run Code Online (Sandbox Code Playgroud)\n

这实际上并不是什么大不了的事,但我想我应该提到它并发表我的看法。如果get*查询未能成功找到元素,它们会抛出一条非常有用的错误消息,向您显示完整的 DOM 结构(带有语法突出显示),这将在调试过程中为您提供帮助。因此,断言永远不可能失败(因为查询将在断言有机会失败之前抛出)。

\n

出于这个原因,很多人都跳过了这个断言。老实说,这确实很好,但我个人通常将断言保留在那里,只是为了向代码读者传达,它不仅仅是重构后悬而未决的旧查询,而是我明确断言它存在。

\n
\n

建议:如果你想断言某事物存在,请明确该断言。

\n
\n
\n