是否必须使用 Jest 和 Enzyme 模拟 useState 挂钩?

Is it obligatory to mock useState hooks with Jest and Enzyme?

是否有义务用 Jest 和 Enzyme 模拟 useState 钩子?因为一个简单的组件做起来很复杂。

Enzyme 的 simulate 功能在这种情况下有效吗?

你唯一的义务是对你正在构建的任何产品、你的业务需求、你的客户和你的团队。当然,您没有 Enzyme 强加的任何义务。您可以很好地使用 Enzyme 而无需模拟 useState.

我会更进一步,建议不要在一般情况下嘲笑 useState,前提是您的团队可以接受并且对您的产品有意义。原因是 useState 是用户不关心的实现细节,并且不是业务规范或组件功能的组成部分。在 useState 和另一种状态管理之间切换不应破坏您的行为测试。

在撰写本文时,Enzyme(连同其侵入性的 100% 线路覆盖理念)通常被逐步淘汰,取而代之的是 React Testing Library 及其“不测试实现细节”的理念。与 Enzyme 不同,RTL 不利于深入了解组件的状态和生命周期,并鼓励测试依赖 UI 和 props 来操作组件。

React documentation 目前建议使用 RTL 和黑盒方法进行测试:

We recommend using React Testing Library which is designed to enable and encourage writing tests that use your components as the end users do.

Elsewhere,上面写着:

React Testing Library is a set of helpers that let you test React components without relying on their implementation details. This approach makes refactoring a breeze and also nudges you towards best practices for accessibility.

Kent Dodds 在 testing implementation details 上有一篇很棒的博客 post,其中提供了酶哲学为何危险的具体示例。这一切都归结为避免“测试用户”——一个假想的应用程序客户端,不能很好地替代实际用户(将使用 UI)和程序员(将使用 API 与模块交互) .未经检查,测试用户往往会对您的测试提出要求,例如 100% 的代码覆盖率以及不一定与组件的功能或行为相关的模拟状态和生命周期。


关于 simulate -- 我不确定您的用例是什么,但它应该在没有状态模拟的情况下正常工作,因为它用于触发元素上的事件,触发组件的事件处理程序。