【问题标题】:How to reset state beforeEach/afterEach jest test?如何重置状态 beforeEach/afterEach 笑话测试?
【发布时间】:2019-05-15 05:01:33
【问题描述】:

我的组件都需要由状态提供程序包装以使它们工作,因此当我渲染每个组件进行测试时,我将它们包装在状态提供程序中。像这样:

<StateProvider>
  <ThemeProvider theme={theme}>
    <Component_Being_Tested />
  </ThemeProvider>
</StateProvider>

我遇到的问题是,当组件在其测试期间更改状态时,它不会在下一次测试运行之前将状态重置回其初始状态。这会导致许多测试失败。

例如,我有一个包含“显示/隐藏密码”按钮的密码输入组件。单击时,它将切换布尔状态值showPassword。初始状态设置为false,这导致输入类型为“密码”。第一次单击时,它会将状态更改为true,并且该组件将输入类型更改为“文本”。

当我在这个组件上运行一个涉及单击按钮的测试时,第一个测试运行得很好。但是,在运行第一个测试之后,showPassword 的状态保持为true,而不是重置为其初始false 值。

因此,如果我运行另一个涉及单击按钮的测试,则测试将失败,因为单击按钮会将showPassword 状态切换回其初始false,而测试预计它会更改为true

我尝试创建一个重置状态的函数并在 beforeEach() 中运行它,如下所示:

beforeEach(() => useContext(Store).dispatch(resetState()));

但是它失败了,因为 useContext 是一个 React Hook 并且只能在函数组件中调用。

我还能如何在每次测试之前/之后重置状态?

【问题讨论】:

  • // 导入它以清理测试之间的 DOM 至关重要,否则测试将失败。 import 'react-testing-library/cleanup-after-each' 注意,这存在于较新版本的 react-testing-library 中。我正在使用 ^6.0.0 版本,这是必需的。

标签: jestjs


【解决方案1】:

如果你想使用React Testing Library,你可以使用afterEach(cleanup)

除此之外,我会更改您的组件架构。将其拆分为display and container components。这样,您可以通过控制其在测试中的状态来显式地测试显示(展示)组件。您可以使用功能和/或 E2E 测试来测试容器组件。这是一个很棒的guide for testing React

【讨论】:

  • 我实际上正在使用 react-testing-library 但它没有清理状态。我已经将组件拆分为容器(处理逻辑)和布局(处理演示),但我的容器需要运行一些函数并首先将结果传递到布局中。
  • @GCM 您是否为每个测试使用新的渲染?这也可能导致状态未重置。
  • 是的,每个测试都有新的渲染。我已将组件包装在自定义渲染 (testing-library.com/docs/react-testing-library/…) 中,但即使我删除自定义渲染并将提供程序直接添加到测试渲染中,我仍然遇到同样的问题。
  • 嘿@Jake,你终于解决了这个问题吗?怎么样?
猜你喜欢
  • 2023-01-17
  • 1970-01-01
  • 2017-02-27
  • 2013-06-23
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多