Hallo! Als Enzyme-Anbieter habe ich viele Leute am Kopf kratzen sehen, wenn es um das Testen von Portalen in React-Komponenten mit Enzyme geht. Portale sind eine ziemlich coole Funktion in React, mit der Sie untergeordnete Elemente in einen DOM-Knoten rendern können, der außerhalb der DOM-Hierarchie der übergeordneten Komponente existiert. Aber sie zu testen kann ein bisschen mühsam sein. In diesem Blogbeitrag werde ich einige Tipps und Tricks zum Testen von Portalen in React-Komponenten mit Enzyme teilen.
Was sind Portale in React?
Bevor wir uns mit dem Testen befassen, werfen wir einen kurzen Blick darauf, was Portale sind. In React bieten Portale eine erstklassige Möglichkeit, untergeordnete Elemente in einen DOM-Knoten zu rendern, der außerhalb der DOM-Hierarchie der übergeordneten Komponente existiert. Hier ist ein einfaches Beispiel für die Verwendung eines Portals in React:
import React aus 'react'; ReactDOM aus „react-dom“ importieren; const PortalExample = ({children }) => { return ReactDOM.createPortal(children, document.getElementById('portal-root') ); }; Standard-PortalExample exportieren;
In diesem Beispiel ist diePortalBeispielDie Komponente nimmt einige untergeordnete Elemente und rendert sie mit der ID im DOM-KnotenPortal-Root, die sich an einer beliebigen Stelle im HTML-Dokument befinden kann, sogar außerhalb des DOM-Baums der übergeordneten Komponente.
Warum das Testen von Portalen schwierig ist
Das Testen von Portalen kann eine Herausforderung sein, da Enzyme standardmäßig nur mit dem React-Komponentenbaum interagiert und nicht direkt mit dem eigentlichen DOM, in dem das Portal seine untergeordneten Elemente rendert. Das bedeutet, dass Sie möglicherweise nicht auf den gerenderten Inhalt des Portals zugreifen können, wenn Sie versuchen, eine Komponente zu testen, die ein Portal mit den normalen Methoden von Enzyme verwendet.
Einrichten der Testumgebung
Als Erstes müssen Sie Ihre Testumgebung einrichten. Stellen Sie sicher, dass Enzyme und sein Adapter für React in Ihrem Projekt installiert sind. Wenn Sie React 16 oder höher verwenden, benötigen Sie dieEnzym-Adapter-React-16oder eine spätere Version, abhängig von Ihrer React-Version.
npm install --save-dev Enzym Enzym-Adapter-React-16
Konfigurieren Sie dann Enzyme in Ihrer Test-Setup-Datei für die Verwendung des Adapters:
Enzym aus „Enzym“ importieren; Adapter aus „enzyme-adapter-react-16“ importieren; Enzyme.configure({ adapter: new Adapter() });
Testen von Portalen mit Enzym
Kommen wir nun zum eigentlichen Testen. Es gibt verschiedene Ansätze, um Portale in React-Komponenten mit Enzyme zu testen.
1. Das Portal verspotten
Eine Möglichkeit, eine Komponente zu testen, die ein Portal verwendet, besteht darin, die Portalfunktionalität zu simulieren. Anstatt die untergeordneten Elemente tatsächlich in einem separaten DOM-Knoten zu rendern, können Sie sie während des Tests direkt in der normalen Rendermethode der Komponente rendern.


Hier ist ein Beispiel, wie Sie dies tun können:
import React aus 'react'; import { mount } aus 'Enzym'; const PortalExample = ({ children, usePortal = true }) => { if (usePortal) { return ReactDOM.createPortal(children, document.getElementById('portal-root') ); } return <div>{children}</div>; }; beschreiben('PortalExample', () => { it('sollte untergeordnete Elemente rendern, wenn das Portal nicht verwendet wird', () => { const wrapper = mount(<PortalExample usePortal={false}>Test Content</PortalExample>); Expect(wrapper.text()).toBe('Test Content'); }); });
In diesem Beispiel haben wir a hinzugefügtusePortalStütze zumPortalBeispielKomponente. WannusePortalIstFALSCH, rendert die Komponente die untergeordneten Elemente direkt in a<div>statt ein Portal zu nutzen. Auf diese Weise können wir die Funktionalität der Komponente einfach mit den normalen Methoden von Enzyme testen.
2. Testen des DOM-Knotens des Portals
Ein anderer Ansatz besteht darin, den tatsächlichen DOM-Knoten zu testen, auf dem das Portal seine untergeordneten Knoten rendert. Dazu müssen Sie auf den DOM-Knoten zugreifen und dessen Inhalt überprüfen.
import React aus 'react'; import { mount } aus 'Enzym'; const PortalExample = ({children }) => { return ReactDOM.createPortal(children, document.getElementById('portal-root') ); }; beschreiben('PortalExample', () => { it('sollte untergeordnete Elemente im Portalstamm rendern', () => { const portalRoot = document.createElement('div'); portalRoot.id = 'portal-root'; document.body.appendChild(portalRoot); const wrapper = mount(<PortalExample>Test Content</PortalExample>); erwarten(portalRoot.textContent).toBe('Testinhalt'); document.body.removeChild(portalRoot); }); });
In diesem Beispiel erstellen wir einen neuen DOM-Knoten mit der IDPortal-RootMontieren Sie im Test die Komponente mit Enzyme und überprüfen Sie dann den Inhalt derportalRootKnoten. Nachdem der Test abgeschlossen ist, entfernen wir dieportalRootKnoten aus dem DOM zum Bereinigen.
Verwendung von Bibliotheken von Drittanbietern
Es gibt auch einige Bibliotheken von Drittanbietern, die das Testen von Portalen mit Enzyme erleichtern können. Zum Beispiel die@testing-library/reactDie Bibliothek verfügt über integrierte Unterstützung für Testportale. Sie können es in Kombination mit Enzyme verwenden, um Ihre React-Komponenten effektiver zu testen.
npm install --save-dev @testing-library/react
Hier ist ein Beispiel dafür, wie Sie es verwenden können@testing-library/reactSo testen Sie eine Komponente, die ein Portal verwendet:
import React aus 'react'; import { mount } aus 'Enzym'; import { render, screen } from '@testing-library/react'; const PortalExample = ({children }) => { return ReactDOM.createPortal(children, document.getElementById('portal-root') ); }; beschreiben('PortalExample', () => { it('sollte untergeordnete Elemente im Portalstamm rendern', () => { const portalRoot = document.createElement('div'); portalRoot.id = 'portal-root'; document.body.appendChild(portalRoot); render(<PortalExample>Test Content</PortalExample>); Expect(screen.getByText('Test Content')).toBeInTheDocument(); document.body.removeChild(portalRoot); }); });
In diesem Beispiel verwenden wir@testing-library/react'SmachenFunktion zum Rendern der Komponente undscreen.getByTextum zu überprüfen, ob der Inhalt im Portalstamm gerendert wird.
Abschluss
Das Testen von Portalen in React-Komponenten mit Enzyme kann schwierig sein, aber mit dem richtigen Ansatz ist es definitiv machbar. Unabhängig davon, ob Sie das Portal verspotten, den DOM-Knoten des Portals testen oder Bibliotheken von Drittanbietern verwenden, kommt es darauf an, einen Weg zu finden, auf den vom Portal gerenderten Inhalt zuzugreifen und ihn zu überprüfen.
Wenn Sie an unseren Enzymprodukten interessiert sind oder Fragen zum Testen von React-Komponenten haben, können Sie sich gerne an ein Beschaffungsgespräch wenden. Wir sind hier, um Ihnen zu helfen, das Beste aus Enzyme in Ihren Projekten herauszuholen.
Wenn Sie sich übrigens auch für Kräuterextrakte interessieren, schauen Sie sich diese Links an:Schwarze chinesische Wolfsbeere,CBD-Kaffee, UndHochwertiges Terpentinöl/Terpentinöl zum Fabrikpreis/mineralisches Terpentinöl.
Referenzen
- Offizielle React-Dokumentation auf Portalen: React Team.
- Offizielle Enzymdokumentation: Airbnb.
- @testing-library/react offizielle Dokumentation: Testing Library Team.