酶、ReactTestUtils 和 react-testing-library 之间的区别

IT技术 reactjs enzyme react-testing-library
2021-04-26 07:14:36

用于react测试的酶、ReactTestUtils 和 react-testing-library 有什么区别?

ReactTestUtils 文档说:

ReactTestUtils 可以轻松地在您选择的测试框架中测试 React 组件。

酶文档只是说:

Enzyme 是 React 的 JavaScript 测试实用程序,它可以更轻松地断言、操作和遍历 React 组件的输出。

React-testing-library 文档:

react-testing-library 是一个用于测试 React 组件的轻量级解决方案。它在 react-dom 之上提供了轻量级的实用功能。

为什么实际上每个解决方案都更容易,而另一个解决方案无法实现?

3个回答

ReactTestUtils 为您提供了测试 React 组件的最低限度。我还没有看到它被用于大型应用程序。

Enzyme 和 react-testing-library 都是很好的库,它们为您提供了测试应用程序所需的所有工具。虽然他们有两种不同的哲学。

Enzyme 允许您访问组件的内部工作原理。您可以读取和设置状态,并且可以模拟子项以使测试运行得更快。

另一方面, react-testing-library 不允许您访问实现细节。它呈现组件并提供与它们交互的实用方法。这个想法是您应该以与用户相同的方式与您的应用程序进行通信。因此,与其设置组件的状态,不如重现用户为达到该状态而执行的操作。

根据我的经验,Enzyme 更容易掌握,但从长远来看,它更难维护。react-testing-library 强制您编写平均而言稍微复杂一些的测试,但它会让您对代码更有信心。

用于单元/集成测试。它的 API 旨在测试实现。它提供了不需要 DOM(用于浅层渲染)的自定义渲染器,其行为与 React 渲染器不同,并允许对单元测试很重要但默认渲染器不可能或直接的事情,如同步状态更新、浅层渲染、禁用生命周期方法等。

react-testing-library用于黑盒集成/e2e 测试。它在内部使用 React 渲染器和 ReactTestUtils,需要真正的 DOM,因为它是在测试中断言的组件输出,而不是内部。它不提供用于隔离单元测试的工具,但可以通过模拟包含需要通过其他方式监视、模拟或存根的组件的module来实现,尤其是jest.mock.

react-dom/test-utilsreact-test-renderer包含一个功能子集,Enzyme 和 react-testing-library 建立在它们之上。API 很少,需要编写样板代码或自定义实用程序函数以进行全面测试。React官方将Enzyme 和 react-testing-library 作为更好的替代品进行推广

React 测试库可以替代 Enzyme。他们有非常不同的测试理念 - Enzyme 鼓励(并提供实用程序)使用渲染的组件实例测试实现细节,而 RTL 鼓励通过查询和对实际 DOM 节点做出断言来仅测试“最终结果”。