Enzyme is dead. Now what?
Tags: react, testing
Published: 2021-12-20 10:59:30

---
title: Enzyme is dead. Now what?
published: true
description: A warning from the maintainer of React 17 Enzyme adapter.
tags: react, testing
//cover_image: https://direct_url_to_image.jpg
---

I'm the maintainer of `@wojtekmaj/enzyme-adapter-react-17`. **I'm here to warn you. Enzyme**, a popular utility to test React components, **is dead**. It's time to move on. Here's why I think so.

For a long time, Enzyme has been the 1st choice when it comes to testing React applications, despite of how bumpy the road to Enzyme React 16 support was. Even today, [**1/3 of React apps are still being tested using Enzyme!**](https://npm-stat.com/charts.html?package=%40testing-library%2Freact&package=enzyme)

## How `@wojtekmaj/enzyme-adapter-react-17` came to life

Back in August 2020, React 17 Release Candidate [came out](https://reactjs.org/blog/2020/08/10/react-v17-rc.html). Shortly after, an [issue has been raised](https://github.com/enzymejs/enzyme/issues/2429) in Enzyme repository to add support for React 17. Immediately after, @layershifter has [opened a PR](https://github.com/enzymejs/enzyme/pull/2430) adding an official `enzyme-adapter-react-17`.

Unfortunately, there were (and, spoiler alert, still are) some issues with testing that prevented this PR from being merged.

Now, here's the thing. I'm the maintainer of many popular React packages, [React-PDF](https://www.npmjs.com/package/react-pdf), [React-Calendar](https://www.npmjs.com/package/react-calendar), and [React-Date-Picker](https://www.npmjs.com/package/react-date-picker) just to name a few. Professionally, I maintain several large projects, which collectively have more than 30,000 Enzyme-based unit tests.

I was in no position to wait for Enzyme to add support for React 17 to support React 17 in my packages. Rewriting all unit tests also looked like no fun to me. So, I've decided to act and publish a temporary adapter based on Oleksandr's work.

It wasn't only the adapter though: certain changes were also necessary in Enzyme adapter utils, which all Enzyme adapters depend on, so a fork of them was also needed. A couple of tireless evenings later, `@wojtekmaj/enzyme-adapter-react-17` was born.

## Fast-forward one year

The issue for adding React 17 support remains open and has become nothing but a source of bitter comments mixed with unproductive "any updates?". Oleksandr's PR remains unmerged. `enzyme-adapter-react-17` is nowhere in sight. **The unofficial adapter I published** with an intention of being just a stepping stone before everyone eventually migrates to `enzyme-adapter-react-17`, **has become _de facto_ the default adapter for React 17**, with 16 million downloads so far.

Retrospectively, **I'm not sure if publishing the package was a good decision.**

On one hand, this move has helped thousands of developers worldwide to upgrade to React 17, relatively hassle-free. 

On the other, I helped prolonging Enzyme's inevitable death and thus gave many developers hope and a sense of safety they shouldn't get to feel. **And I'm sorry for that.**

## React 18

Before I came to this conclusion though, React 18 beta was announced, and of course, I jumped to see **if `@wojtekmaj/enzyme-adapter-react-18` could be released.**

The big thing in React 18 are concurrent features. To opt-in, after upgrading to React 18, you also need to switch to the new `createRoot` API:

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

// after
const container = document.getElementById('root');
const root = ReactDOM.createRoot(container);
root.render(<App/>);
```

Until you switch to the new API, your app will behave as if it's running React 17. So if you don't plan to do this, there's no point of upgrading!

I quickly realized that the API changes in React 18 meant that **releasing a React 18 Enzyme adapter will not be possible** without a huge rework of not only the adapter itself, but also Enzyme, `enzyme-adapter-utils` and `enzyme-adapter-react-helper`.

Trust me, it's not gonna happen. It's over. No more "stepping stones". And certainly no more official adapters. **Whether or not you plan to upgrade to React 18 in the near future, you should consider looking for Enzyme alternative right now.**

## What should I do? 😱

The answer is, as always, it depends. You don't _have_ to upgrade React, after all.

Here's what I would do:

* Start [familiarizing yourself with React Testing Library](https://testing-library.com/docs/react-testing-library/intro/), an officially recommended library for React components.
* Make a rule to write new tests using RTL only.
* Consider making a rule to rewrite tests to RTL whenever you need to touch them and/or the component they are testing.
* In your designated time for repaying technical debt (you have designated time for repaying technical debt, right? …right?), rewrite your remaining Enzyme-based tests to RTL.
* Clean up your repo from Enzyme-specific bits
* When you're ready, upgrade to React 18.

### A bit of personal advice

While [Migrate from Enzyme support article](https://testing-library.com/docs/react-testing-library/migrate-from-enzyme) is available, I suggest you to just start fresh, forgetting that Enzyme has ever existed. **RTL is by no means an Enzyme drop-in replacement**, so having a completely fresh mindset will help you getting the most of it.