Hej där! Som enzymleverantör har jag sett många människor skrapa på huvudet när det gäller att testa portaler i React -komponenter med enzym. Portaler är en ganska cool funktion i React som låter dig göra barn till en DOM -nod som finns utanför DOM -hierarkin i moderkomponenten. Men att testa dem kan vara lite smärta i du-vet-vad. I det här blogginlägget kommer jag att dela några tips och tricks om hur man testar portaler i React -komponenter med enzym.
Vad är portaler i React?
Innan vi dyker i testning, låt oss snabbt gå igenom vad portaler är. I React tillhandahåller portaler ett förstklassigt sätt att göra barn till en DOM-nod som finns utanför DOM-hierarkin i moderkomponenten. Här är ett enkelt exempel på att använda en portal i React:
Importera React från 'React'; importreaktdom från 'react-dom'; const portalexample = ({barn}) => {return reactdom.createPortal (barn, dokument.getElementById ('portal-root')); }; Exportera standard Portalexample;
I det här exempletPortalexampleKomponent tar några barn och gör dem till DOM -noden med IDrötning, som kan vara var som helst i HTML -dokumentet, även utanför moderkomponentens DOM -träd.
Varför att testa portaler är svårt
Testportaler kan vara utmanande eftersom enzym, som standard, bara interagerar med React -komponentträdet och inte direkt interagerar med den faktiska DOM där portalen gör sina barn. Detta innebär att om du försöker testa en komponent som använder en portal med hjälp av enzyms normala metoder, kanske du inte kan komma åt portalens återgivna innehåll.
Ställa in testmiljön
Första saker först, du måste ställa in din testmiljö. Se till att du har enzym och dess adapter för React installerat i ditt projekt. Om du använder React 16 eller senare behöver duenzymadapter-reakt-16eller en senare version beroende på din React -version.
NPM Installation-Save-dev-enzymenzym-adapter-reaktion-16
Sedan, i din testinställningsfil, konfigurera enzym för att använda adaptern:
importera enzym från 'enzym'; Importera adapter från 'enzym-adapter-reaktion-16'; Enzym.configure ({adapter: ny adapter ()});
Testningsportaler med enzym
Låt oss nu komma in i den faktiska testningen. Det finns några olika tillvägagångssätt du kan ta för att testa portaler i React -komponenter med enzym.
1. Hånar portalen
Ett sätt att testa en komponent som använder en portal är att håna portalfunktionen. Istället för att faktiskt göra barnen till en separat DOM -nod, kan du göra dem direkt i komponentens normala återgivningsmetod under testning.


Här är ett exempel på hur du kan göra detta:
Importera React från 'React'; importera {Mount} från 'enzym'; const PortalExample = ({barn, usePortal = true}) => {if (usePortal) {return reactdom.createPortal (barn, dokument.getElementById ('portal-root')); } return <div> {barn} </div>; }; beskriva ('portalexample', () => {it ('bör göra barn när du inte använder portal', () => {const wrapper = mount (<portalexample useportal = {falsk}> testinnehåll </portalexample>); förvänta sig (wrapper.text ()). Tobe ('testinnehåll');});});
I det här exemplet lade vi till enussportalstänga avPortalexamplekomponent. Närussportalärfalsk, komponenten gör barnen direkt i en<div>istället för att använda en portal. På detta sätt kan vi enkelt testa komponentens funktionalitet med enzyms normala metoder.
2. Testa portalens DOM -nod
Ett annat tillvägagångssätt är att testa den faktiska DOM -noden där portalen gör sina barn. För att göra detta måste du komma åt DOM -noden och kontrollera innehållet.
Importera React från 'React'; importera {Mount} från 'enzym'; const portalexample = ({barn}) => {return reactdom.createPortal (barn, dokument.getElementById ('portal-root')); }; beskriva ('portalexample', () => {it ('bör göra barn i portalroten', () => {const portalroot = document.createElement ('div'); portalroot.id = 'Portal-Root'; Document.body.AppendChild (portalroot); const wrapper = Mount (<portalexpley> Test Content Content Contention> Test ContentSt Contemance> förvänta sig (portalroot.textcontent) .tobe ('testinnehåll');
I det här exemplet skapar vi en ny DOM -nod med IDrötningMontera i testet komponenten med enzym och kontrollera sedan innehållet iportalrootnod. När testet är gjort tar vi bortportalrootnod från DOM för att rensa upp.
Använda tredjepartsbibliotek
Det finns också några tredjepartsbibliotek som kan underlätta testportaler med enzym. Till exempel@Test-library/ReactBiblioteket har inbyggt stöd för testportaler. Du kan använda den i kombination med enzym för att testa dina React -komponenter mer effektivt.
NPM Installation-Save-Dev @Test-Library/React
Här är ett exempel på hur du kan använda@Test-library/ReactFör att testa en komponent som använder en portal:
Importera React från 'React'; importera {Mount} från 'enzym'; importera {render, skärm} från '@test-library/react'; const portalexample = ({barn}) => {return reactdom.createPortal (barn, dokument.getElementById ('portal-root')); }; beskriva ('portalexample', () => {it ('bör göra barn i portalroten', () => {const portalroot = document.createElement ('div'); portalroot.id = 'portal-root'; document.body.AppendChild (portalroot); render (<portalexample> test content </portalExem i ” Innehåll ')).
I det här exemplet använder vi@Test-library/ReactSgörafunktion för att göra komponenten ochscreen.getbytextför att kontrollera om innehållet återges i portalroten.
Slutsats
Att testa portaler i React -komponenter med enzym kan vara svårt, men med rätt tillvägagångssätt är det definitivt genomförbart. Oavsett om du väljer att håna portalen, testa portals DOM-nod eller använda tredjepartsbibliotek, är nyckeln att hitta ett sätt att komma åt och verifiera det innehåll som serveras av portalen.
Om du är intresserad av våra enzymprodukter eller har några frågor om att testa React -komponenter, känn dig fri att nå ut till en upphandlingsdiskussion. Vi är här för att hjälpa dig att få ut det mesta av enzymet i dina projekt.
Förresten, om du också är intresserad av växtbaserade extrakt, kolla in dessa länkar:Svart kinesisk vargbär,CBD -kaffeochHögkvalitativ terpentinolja/terpentinolja Fabrikspris/mineraliska terpentinolja.
Referenser
- React officiell dokumentation om portaler: React -teamet.
- Enzym officiell dokumentation: Airbnb.
- @Test-bibliotek/React Officiell dokumentation: Testing Library Team.