当前工作解决方案
使用这个 html:
<p data-testid="foo">Name: <strong>Bob</strong> <em>(special guest)</em></p>
我可以使用 React 测试库 getByTestId
方法找到 textContent
:
expect(getByTestId('foo').textContent).toEqual('Name: Bob (special guest)')
有没有更好的办法?
我想简单地使用这个html:
<p>Name: <strong>Bob</strong> <em>(special guest)</em></p>
并使用 React Testing Library 的 getByText
方法如下:
expect(getByText('Name: Bob (special guest)')).toBeTruthy()
但这不起作用。
那么,问题…
有没有更简单的方法来使用 React 测试库来查找带标签的文本内容字符串?
原文由 Beau Smith 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新 3
按照 下面 forrestDinos 的建议,使用来自
testing-library/jest-dom
的toHaveTextContent
。更新 2
多次使用后,我创建了一个助手。下面是使用此帮助程序的示例测试。
测试助手:
测试:
更新 1
这是一个创建新匹配器
getByTextWithMarkup
的示例。请注意,此函数在测试中扩展了getByText
,因此必须在此处定义。 (当然可以更新函数以接受getByText
作为参数。)这是 Giorgio Polvara 博客 中 关于测试库的你(可能)不知道的五件事 中的第四个的可靠答案:
查询也接受函数
您可能已经看到过这样的错误:
通常,发生这种情况是因为您的 HTML 如下所示:
解决方案包含在错误消息中:“[…] 您可以为文本匹配器提供功能 […]”。
那是怎么回事?事实证明,匹配器接受字符串、正则表达式或函数。
该函数会为您渲染的每个节点调用。它接收两个参数:节点的内容和节点本身。您所要做的就是根据节点是否是您想要的节点返回 true 或 false。
一个例子将澄清它:
我们忽略了
content
参数,因为在这种情况下,它将是“Hello”、“world”或空字符串。我们正在检查的是当前节点是否具有正确的 textContent 。
hasText
是一个小辅助功能。我宣布它是为了保持清洁。但这还不是全部。我们的
div
不是我们要查找的文本的唯一节点。例如,body
在这种情况下具有相同的文本。为了避免返回比需要更多的节点,我们确保没有一个子节点与其父节点具有相同的文本。通过这种方式,我们确保我们返回的节点是最小的——换句话说,那个节点靠近我们的 DOM 树的底部。阅读其余的 关于测试库你(可能)不知道的五件事