Back

Wie Sie Ihre Tests von Enzyme auf React Testing Library migrieren

Wie Sie Ihre Tests von Enzyme auf React Testing Library migrieren

Wenn Ihre React-Testsuite noch immer auf Enzyme basiert, warten Sie Code für eine Bibliothek, die seit Jahren keine offiziellen Updates mehr erhalten hat. Enzyme verfügt über keinen Adapter für React 18 oder 19, und inoffizielle Workarounds sind unzuverlässig. Der Weg nach vorne ist klar: Migrieren Sie zu React Testing Library (RTL).

Dieser Artikel behandelt die konzeptionellen Veränderungen, die für eine erfolgreiche Migration von Enzyme zu React Testing Library erforderlich sind, gängige Refactoring-Muster und praktische Anleitungen für Teams, die diese Arbeit im Jahr 2025 angehen.

Wichtigste Erkenntnisse

  • Enzyme verfügt über keine offiziellen Adapter für React 18 und 19, wodurch die Migration zu React Testing Library für moderne React-Projekte unerlässlich wird.
  • RTL konzentriert sich auf das Testen von benutzerseitigem Verhalten statt auf Implementierungsdetails und erzeugt dadurch stabilere und aussagekräftigere Tests.
  • Ersetzen Sie Enzymes shallow() und mount() durch RTLs render() und verwenden Sie barrierefreie Abfragen wie getByRole() anstelle von find().
  • Migrieren Sie schrittweise, indem Sie beide Bibliotheken parallel laufen lassen und Tests in Stapeln konvertieren, beginnend mit einfacheren Komponenten.

Warum Enzyme nicht mehr tragfähig ist

Enzyme war jahrelang das dominierende React-Testing-Tool. Doch seine enge Kopplung an React-Interna wurde zur Belastung. Als React 17 erschien, füllten Community-Adapter die Lücke. React 18 durchbrach dieses Muster vollständig – es existiert kein offizieller Adapter, und keiner wurde angekündigt, da das Enzyme-Projekt faktisch nicht mehr gewartet wird.

Über die Kompatibilität hinaus förderte Enzyme das Testen von Implementierungsdetails: Überprüfung des internen Zustands, Aufrufen von Instanzmethoden und Verwendung von Shallow Rendering zur Isolierung von Komponenten von ihren Kindern. Diese Muster erzeugen fragile Tests, die bei Refactorings brechen, selbst wenn das Verhalten gleich bleibt.

React Testing Library verfolgt den entgegengesetzten Ansatz. Es rendert Komponenten vollständig und fragt das DOM so ab, wie Benutzer damit interagieren – nach Rolle, Label und Textinhalt. Dies entspricht modernen Best Practices für React-Testing und erzeugt Tests, die bei Implementierungsänderungen stabil bleiben.

Der grundlegende Paradigmenwechsel

Die größte Herausforderung bei dieser Migration ist nicht die Syntax. Es ist die Denkweise.

Enzyme-Tests sehen oft so aus:

  • Zugriff auf Komponenteninstanz über wrapper.instance()
  • Direkter Aufruf von setState() oder setProps()
  • Assertions auf interne Zustandswerte
  • Verwendung von shallow() zum Überspringen des Renderings von Child-Komponenten

Keines davon hat ein direktes RTL-Äquivalent. RTL lässt diese bewusst weg, weil sie Dinge testen, die Benutzer nie sehen.

Stattdessen konzentrieren sich RTL-Tests auf:

  • Was im DOM gerendert wird
  • Wie Elemente auf Benutzerinteraktionen reagieren
  • Ob barrierefreie Rollen und Labels vorhanden sind

Um Enzyme Shallow Rendering zu ersetzen, rendern Sie den vollständigen Komponentenbaum und mocken Abhängigkeiten bei Bedarf auf Modulebene. Dies erfordert mehr Setup, erzeugt aber aussagekräftigere Testabdeckung.

Gängige Refactoring-Muster

Ersetzen Sie shallow() und mount() durch render()

RTLs render()-Funktion mountet Ihre Komponente in eine DOM-Umgebung. Es gibt kein Shallow-Äquivalent. Wenn Child-Komponenten Probleme verursachen, mocken Sie sie mit Jest:

jest.mock('./ChildComponent', () => () => <div data-testid="child-mock" />);

Ersetzen Sie wrapper.find() durch barrierefreie Abfragen

Enzymes find('button') wird zu RTLs screen.getByRole('button'). Bevorzugen Sie Abfragen, die widerspiegeln, wie Benutzer Elemente lokalisieren:

  • getByRole() für interaktive Elemente
  • getByLabelText() für Formulareingaben
  • getByText() für sichtbaren Inhalt

Entfernen Sie instance()- und state()-Assertions

Wenn Sie testen, dass ein Klick auf einen Button den internen Zustand aktualisiert, formulieren Sie den Test um: Was sieht der Benutzer nach dem Klick? Assertieren Sie stattdessen auf die gerenderte Ausgabe.

Behandeln Sie asynchrones Verhalten mit findBy und waitFor

Enzyme erforderte manuelle wrapper.update()-Aufrufe. RTL behandelt Updates automatisch. Verwenden Sie findByRole() oder waitFor() für asynchrone Assertions.

Migration in der Praxis ist machbar

Große Teams haben diese Migration erfolgreich abgeschlossen. Slack Engineering konvertierte über 15.000 Tests unter Verwendung einer Kombination aus AST-basierten Codemods und LLM-gestützten Transformationen. Das Engineering-Team der New York Times beschrieb ihre Enzyme-Migration als den größten Teil ihres React-18-Upgrades.

Der gängige Ansatz: Schrittweise migrieren. Beide Bibliotheken parallel laufen lassen. Tests in Stapeln konvertieren, beginnend mit einfacheren Komponenten. Automatisierung einsetzen, wo Syntaxänderungen mechanisch sind, aber manuelle Arbeit für Tests erwarten, die stark auf Implementierungsdetails angewiesen waren.

React 19 und die Zukunft des Komponententestings

React 19 markiert react-test-renderer für Komponententests als veraltet, wodurch RTL weiter als Standard konsolidiert wird. Wenn Sie ein React-Upgrade planen, beseitigt der vorherige Abschluss Ihrer Migration von Enzyme zu React Testing Library ein großes Hindernis.

Modernes React-Testing im Jahr 2025 bedeutet Tests zu schreiben, die Refactorings überstehen, Barrierefreiheit validieren und echtes Benutzerverhalten widerspiegeln. RTL erfüllt alle drei Punkte.

Fazit

Die Migration von Enzyme erfordert mehr als Suchen-und-Ersetzen. Sie übernehmen eine andere Testing-Philosophie – eine, die benutzerseitiges Verhalten gegenüber interner Implementierung priorisiert. Der Aufwand zahlt sich in Tests aus, die stabiler, aussagekräftiger und mit aktuellen und zukünftigen React-Versionen kompatibel sind.

Beginnen Sie mit einem kleinen Stapel. Formulieren Sie Ihre Assertions um das um, was Benutzer sehen. Lassen Sie Shallow Rendering los. Ihre Testsuite wird davon profitieren.

Häufig gestellte Fragen (FAQs)

Ja. Beide Bibliotheken können im selben Projekt koexistieren. Dies ermöglicht es Ihnen, Tests schrittweise zu migrieren, ohne Ihre bestehende Testsuite zu stören. Installieren Sie RTL neben Enzyme, konvertieren Sie Tests in Stapeln und entfernen Sie Enzyme, sobald die Migration abgeschlossen ist.

RTL rät davon ab, den internen Zustand direkt zu testen. Testen Sie stattdessen das beobachtbare Ergebnis. Wenn ein Klick auf einen Button den Zustand ändert, überprüfen Sie, was der Benutzer nach dem Klick sieht – wie aktualisierter Text, ein neu erscheinendes Element oder ein geändertes Attribut. Dieser Ansatz erzeugt widerstandsfähigere Tests.

Mocken Sie die problematische Child-Komponente auf Modulebene mit Jest. Dies isoliert Ihren Test von der Implementierung des Childs, während die Parent-Komponente weiterhin vollständig gerendert wird. Verwenden Sie jest.mock, um das Child durch ein einfaches Platzhalter-Element zu ersetzen.

Ja. RTL bleibt die empfohlene Testing-Bibliothek für React 19. React 19 markiert react-test-renderer für Komponententests als veraltet, wodurch RTL zur Standardwahl wird. Der Abschluss Ihrer Migration vor dem Upgrade auf React 19 beseitigt ein erhebliches Kompatibilitätshindernis.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay