【发布时间】:2022-01-06 03:29:05
【问题描述】:
用 Jest 和 Enzyme 模拟 useState 钩子是否有义务?因为一个简单的组件做起来很复杂。
Enzyme 的simulate 函数在这种情况下有效吗?
【问题讨论】:
用 Jest 和 Enzyme 模拟 useState 钩子是否有义务?因为一个简单的组件做起来很复杂。
Enzyme 的simulate 函数在这种情况下有效吗?
【问题讨论】:
您的唯一义务是对您正在构建的任何产品、您的业务需求、您的客户和您的团队。当然,您没有 Enzyme 规定的任何义务。您可以很好地使用 Enzyme,而无需嘲笑 useState。
我会更进一步,建议不要在一般情况下嘲笑 useState,假设这对您的团队来说没问题并且对您的产品有意义。原因是useState 是用户不关心的实现细节,并且不是组件的业务规范或功能的组成部分。在useState 和其他类型的状态管理之间进行更改不应破坏您的行为测试。
在撰写本文时,Enzyme(连同其具有侵入性的 100% 线路覆盖理念)普遍被淘汰,取而代之的是 React Testing Library 及其“不测试实现细节”理念。与 Enzyme 不同,RTL 不利于深入挖掘组件的状态和生命周期,而是鼓励测试依赖 UI 和 props 来操作组件。
React documentation 目前建议使用 RTL 和黑盒方法进行测试:
我们建议使用 React 测试库,该库旨在支持和鼓励编写测试,像最终用户一样使用您的组件。
Elsewhere,上面写着:
React 测试库是一组帮助程序,可让您测试 React 组件,而无需依赖其实现细节。这种方法使重构变得轻而易举,并推动您采用可访问性的最佳实践。
Kent Dodds 在testing implementation details 上有一篇很棒的博文,其中提供了酶哲学为何危险的具体例子。这一切都归结为避免“测试用户”——一个虚构的应用程序客户端,无法替代实际用户(将使用 UI)和程序员(将使用 API 与模块交互)。未经检查,测试用户往往会对您的测试提出要求,例如 100% 的代码覆盖率和模拟状态和生命周期,这些要求不一定与组件的功能或行为相关。
关于simulate——我不确定你的用例是什么,但它应该可以在没有状态模拟的情况下正常工作,因为它用于触发元素上的事件,触发组件的事件处理程序。
【讨论】: