酶死了。现在怎么办?

2025-06-07

酶死了。现在怎么办?

我是 的维护者@wojtekmaj/enzyme-adapter-react-17我在这里警告你。Enzyme,一个流行的 React 组件测试工具,已经死了。是时候继续前进了。以下是我这么认为的原因。

长期以来,尽管 Enzyme React 16 支持之路坎坷,Enzyme 一直是测试 React 应用程序的首选。即使在今天,仍有 1/3 的 React 应用程序使用 Enzyme 进行测试!

是如何@wojtekmaj/enzyme-adapter-react-17诞生的

早在 2020 年 8 月,React 17 候选版本发布。不久之后, Enzyme 仓库中就有人提出了一个问题,要求添加对 React 17 的支持。紧接着,@layershifter发起了一个 PR,添加了一个官方的enzyme-adapter-react-17

不幸的是,测试中存在一些问题(并且,剧透警告,仍然存在),导致此 PR 无法合并。

现在,事情是这样的。我是许多流行 React 包的维护者,例如React-PDFReact-CalendarReact-Date-Picker。我的专业工作是维护几个大型项目,这些项目总共有超过 30,000 个基于 Enzyme 的单元测试。

我没办法等 Enzyme 添加对 React 17 的支持,我的包也支持 React 17。重写所有单元测试对我来说也不是什么好事。所以,我决定采取行动,并基于 Oleksandr 的工作发布了一个临时适配器。

不过,不仅仅是适配器的问题:Enzyme 适配器实用程序也需要进行一些更改,因为所有 Enzyme 适配器都依赖于这些实用程序,所以也需要对它们进行 fork。经过几个不知疲倦的夜晚,@wojtekmaj/enzyme-adapter-react-17它诞生了。

快进一年

添加 React 17 支持的问题仍然悬而未决,并且已经成为了充满恶意评论的源头,充斥着毫无意义的“有更新吗?”之类的问题。Oleksandr 的 PR 仍然未被合并,也enzyme-adapter-react-17不知所踪。我发布的非官方适配器原本只是大家最终迁移到 React 17 之前的垫脚石enzyme-adapter-react-17,但它实际上已经成为React 17 的默认适配器,迄今为止下载量已达 1600 万次。

回想起来,我不确定发布这个软件包是否是一个正确的决定。

一方面,此举帮助全球数千名开发人员相对轻松地升级到 React 17。

另一方面,我却拖延了Enzyme不可避免的消亡,从而给许多开发者带来了他们本不该拥有的希望和安全感。对此我深感抱歉。

React 18

不过,在我得出这个结论之前,React 18 beta 版已经发布了,当然,我很想看看它是否@wojtekmaj/enzyme-adapter-react-18可以发布。

React 18 的一大亮点是并发特性。要启用并发特性,升级到 React 18 后,你还需要切换到新的createRootAPI:

// before
const container = document.getElementById('root');
ReactDOM.render(<App />, container);

// after
const container = document.getElementById('root');
const root = ReactDOM.createRoot(container);
root.render(<App/>);
Enter fullscreen mode Exit fullscreen mode

在您切换到新 API 之前,您的应用程序的行为就像运行 React 17 一样。因此,如果您不打算这样做,那么升级就没有意义了!

我很快意识到,React 18 中的 API 变化意味着,如果不对适配器本身以及Enzyme 进行大规模的返工,就不可能发布 React 18 Enzyme 适配器enzyme-adapter-utilsenzyme-adapter-react-helper

相信我,这不会发生。一切都结束了。不再有“垫脚石”。当然,也不再有官方适配器。无论你是否计划在不久的将来升级到 React 18,你现在都应该考虑寻找 Enzyme 的替代品。

我该怎么办?😱

答案一如既往,视情况而定。毕竟,你不必升级 React

我会这么做:

  • 开始熟悉 React Testing Library,这是 React 组件的官方推荐库。
  • 制定规则仅使用 RTL 编写新测试。
  • 考虑制定一条规则,每当您需要接触测试和/或它们正在测试的组件时,就将测试重写为 RTL。
  • 在您指定的偿还技术债务的时间内(您有指定的偿还技术债务的时间,对吗?......对吗?),将剩余的基于酶的测试重写为 RTL。
  • 清理你的 repo 中与 Enzyme 相关的部分
  • 准备好后,升级到 React 18。

一些个人建议

虽然有关于从 Enzyme 迁移的支持文章,但我建议您从头开始,忘记 Enzyme 的存在。RTL绝不是 Enzyme 的直接替代品,因此,拥有一个全新的思维模式将有助于您充分利用它。

文章来源:https://dev.to/wojtekmaj/enzyme-is-dead-now-what-ekl
PREV
Migrating your React app from Webpack to Vite
NEXT
一切 JavaScript 数组和数组方法!