首页 > web前端 > js教程 > RICKS用于React测试库,以使您的单位测试更好

RICKS用于React测试库,以使您的单位测试更好

Susan Sarandon
发布: 2025-01-28 22:35:10
原创
432 人浏览过

ricks for React Testing Library to make your unit tests better

有效的反应组件测试至关重要。 React测试库(RTL)简化了此过程,强调用户交互测试。 本文介绍了五种高级RTL技术,用于编写更有效和可维护的单元测试。


1。 优先级用于查询screen>

>避免直接从>中破坏查询。使用

对象一致提高可读性和清晰度。render() screen

好处:

增强的测试可读性。
  • 明确显示与渲染的屏幕元素的相互作用。
  • >
>示例:

而不是:

>使用:
<code class="language-javascript">const { getByText } = render();
expect(getByText(/click me/i)).toBeInTheDocument();</code>
登录后复制
登录后复制

这种方法在较大的测试套件上保持一致性。
<code class="language-javascript">render();
expect(screen.getByText(/click me/i)).toBeInTheDocument();</code>
登录后复制
登录后复制


2。

对于异步操作findBy 对于组件,呈现元素异步(例如,在API调用后),请使用

> QUERIES而不是

>。这样可以确保仅在元素渲染后才能发出断言。findBy getBy

好处:

由于时机问题消除了片状测试。
  • 为异步组件创建更强大的测试。
  • >
>示例:

>或者,
<code class="language-javascript">// Component asynchronously fetches and displays a username
render(<UserProfile />);
const userName = await screen.findByText(/john doe/i);
expect(userName).toBeInTheDocument();</code>
登录后复制
可以实现相似的结果,但是对于其组合

waitFor功能而言,findBy是优选的。 避免一起使用它们。getBy waitFor

<code class="language-javascript">render(<UserProfile />);
await waitFor(() => {
  expect(screen.getByText(/john doe/i)).toBeInTheDocument();
});</code>
登录后复制

3。

对于精确的目标within> 靶向特定容器内的元素时,

实用程序会阻止模棱两可的匹配。

within

好处:

防止意外元素选择。
  • 提高测试精度。
>示例:

这种有针对性的方法会导致更清洁的,更上下文相关的测试。
<code class="language-javascript">render(
  <fieldset name="Personal Information">
    <legend>Personal Information</legend>
    <label htmlFor="personal-name">Name</label>
  </fieldset>
);

const nameLabel = within(screen.getByRole('group')).getByLabelText(/Name/i);
expect(nameLabel).toBeInTheDocument();</code>
登录后复制

4。
用于现实的交互

> userEvent是功能性的,

>提供了更真实的用户互动模拟,包括键入,单击和表。

fireEventuserEvent好处:

更准确的事件模拟。

    处理复杂的互动,例如文本输入。
  • >
  • >示例:

这种方法可确保测试准确反映现实世界的用户行为。

<code class="language-javascript">import userEvent from '@testing-library/user-event';

render(<LoginForm />);
const emailInput = screen.getByLabelText(/email/i);
const passwordInput = screen.getByLabelText(/password/i);
const submitButton = screen.getByRole('button', { name: /submit/i });

await userEvent.type(emailInput, 'test@example.com');
await userEvent.type(passwordInput, 'password123');
await userEvent.click(submitButton);

expect(screen.getByText(/welcome/i)).toBeInTheDocument();</code>
登录后复制

5。

用于DOM检查

> 通过将DOM结构打印到控制台。 debug()好处:

  • >快速识别缺失的元素或测试失败。
  • >
  • >简化调试。

>示例:

<code class="language-javascript">const { getByText } = render();
expect(getByText(/click me/i)).toBeInTheDocument();</code>
登录后复制
登录后复制

针对特定元素也是可能的:

<code class="language-javascript">render();
expect(screen.getByText(/click me/i)).toBeInTheDocument();</code>
登录后复制
登录后复制

>其他提示:

  • 专注于用户交互:测试用户看到和交互的内容,而不是内部组件状态。
  • >组合匹配器:
  • >使用的匹配器进行精确的断言。.toHaveTextContent() .toHaveAttribute()
  • 清理:
  • 当RTL处理清理时,明确调用in cleanup()可防止DOM泄漏。 afterEach>
  • 开玩笑的集成:
  • 考虑使用jest与插件使用jest进行有针对性的测试执行和IDE集成的覆盖范围报告。

结论:

RTL优先考虑以用户为中心的测试。 通过应用这些技术,您将创建更清洁,更可靠和可维护的测试,从而改善整体开发工作流程。 拥抱这些策略以增强您的反应测试实践。

以上是RICKS用于React测试库,以使您的单位测试更好的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板