有很多getBy*
或findBy*
查询与expect().toBeInTheDocument()
一起使用的例子。同时,测试库文档指出,当0个元素匹配时,这两种类型的查询都会抛出错误。
所以有一种情况,当我们执行expect(screen.getByText('some text')).toBeInTheDocument()
时,我们检查了两次元素的存在,这是多余的。
大家这么做的原因是什么?
这纯粹是为了可读性。您实际上并不需要断言.toBeInTheDocument()
或任何其他断言。正如您所说,在失败的情况下,测试失败的错误实际上是由getBy*
方法抛出的-expect
甚至从未被调用。
但是,使用expect(actual).matcher(expected)
形式可以更清楚地表明您正在断言元素的存在,而单独使用getBy*
则不是很明确。读者将期望测试具有一定的"节奏",其中设置了一些先决条件(安排或给定),采取了一些操作(Act或When),并检查了一些后置条件(Assert或Then)。如果一个测试在结束时没有任何expect
标记,那可能看起来像一个错误。
您也可以有lint规则(如jest/expect-expect
,尽管它可以配置为包括getBy*
作为期望)或Jest自己的expect.hasAssertions()
,如果您让断言是隐式的,即使在传递的情况下,它也会不高兴。
Testing Library有自己的ESLint规则,其中包括testing-library/prefer-explicit-assert
,也涵盖了这种行为;上面写着(强调我的):
此规则旨在鼓励用户显式断言存在元素,而不是仅仅使用
getBy*
查询并期望它不会抛出错误,因此更容易理解是什么测试中预期的行为.