在 React 测试期间 getByRole 查询段落不起作用

Sub*_*aik 19 reactjs react-testing-library

我创建了一个简单的计数器应用程序用于学习react testing library。但是当我测试段落是否用{count}文本呈现时,我陷入了困境。

主.jsx

function Main() {
  const [Count, setCount] = useState(0);

  function handleCount() {
    setCount((c) => c + 1);
  }
  return (
    <div>
      <h1>Counter App</h1>
      <Counter count={Count} />
      <Button label="Click me" handleCount={handleCount} />
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

计数器.jsx

function Counter({ count }) {
  return <p>{count}</p>;
}
Run Code Online (Sandbox Code Playgroud)

主要规范.jsx

it("should render count", () => {
    render(<Main />);
    expect(screen.getByRole("paragraph")).toBeInTheDocument();
});
Run Code Online (Sandbox Code Playgroud)

这个测试还不足以通过。我知道我们可以添加data-testid<p>DOM 节点,然后我们可以通过getByTestId查询来测试它。但我想知道为什么我上面使用的测试用例getByRole('paragraph')每次都会失败。

The*_*ool 19

getByRole使用不同元素的 HTML 角色。段落不是有效的角色,这就是您的查询不起作用的原因。您可以在这里阅读有关getByRole https://testing-library.com/docs/dom-testing-library/api-queries/#byrole以及 html 中不同角色的更多信息: https: //www.w3.org/TR /html-aria/#docconformance

例如,您可以使用getByText相反 来实现您想要的(在此处阅读有关首选查询的更多信息: https: //testing-library.com/docs/guide-which-query/)。

expect(screen.getByText("0")).toBeInTheDocument();
Run Code Online (Sandbox Code Playgroud)

  • 链接的 w3 文档表明“paragraph”*是*一个有效角色,并且是“&lt;p&gt;”的隐式角色。该角色[于 2018 年 6 月添加到 ARIA](https://github.com/w3c/aria/commit/907b62da80bf3fb8bbd18768b8f9fa6ca99e1fa8) (9认同)
  • `p` 标签没有隐式角色(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p),因此您必须使用 `aria-role` 自己添加角色如果你想让它发挥作用。我实际上不确定哪些角色适合,我想这很大程度上取决于上下文。 (6认同)
  • 检查并补充说,截至 2023 年 9 月,`screen.getByRole("paragraph")` 无法找到 `p` 元素,尽管它是有效的角色。[有人在 6 月份提出了一个问题,一旦 `aria-query` 发布了一个新版本并修复了该存储库中的问题,该问题就会在 React 测试库中得到修复](https://github.com/testing-library/dom-测试库/问题/1234)。 (6认同)
  • 该段落的有效作用是什么? (3认同)