Ehilà! In qualità di fornitore di Enzyme, ho visto molte persone grattarsi la testa quando si tratta di testare i portali nei componenti React con Enzyme. I portali sono una funzionalità piuttosto interessante in React che ti consente di eseguire il rendering dei bambini in un nodo DOM che esiste al di fuori della gerarchia DOM del componente principale. Ma testarli può essere un po’ una seccatura nel “tu-sai-cosa”. In questo post del blog condividerò alcuni suggerimenti e trucchi su come testare i portali nei componenti React con Enzyme.
Cosa sono i portali in React?
Prima di immergerci nei test, esaminiamo rapidamente cosa sono i portali. In React, i portali forniscono un modo di prima classe per rendere i bambini in un nodo DOM che esiste al di fuori della gerarchia DOM del componente principale. Ecco un semplice esempio di utilizzo di un portale in React:
importa React da 'react'; importa ReactDOM da 'react-dom'; const PortalExample = ({ children }) => { return ReactDOM.createPortal( children, document.getElementById('portal-root') ); }; esporta PortalExample predefinito;
In questo esempio, ilPortalEsempioIl componente prende alcuni bambini e li esegue il rendering nel nodo DOM con l'IDradice del portale, che potrebbe trovarsi ovunque nel documento HTML, anche al di fuori dell'albero DOM del componente principale.
Perché testare i portali è complicato
Testare i portali può essere impegnativo perché Enzyme, per impostazione predefinita, interagisce solo con l'albero dei componenti React e non interagisce direttamente con il DOM effettivo in cui il portale esegue il rendering dei suoi figli. Ciò significa che se provi a testare un componente che utilizza un portale utilizzando i normali metodi di Enzyme, potresti non essere in grado di accedere al contenuto renderizzato del portale.
Impostazione dell'ambiente di test
Per prima cosa, devi configurare il tuo ambiente di test. Assicurati di avere Enzyme e il suo adattatore per React installati nel tuo progetto. Se utilizzi React 16 o versioni successive, avrai bisogno dienzima-adattatore-reagire-16o una versione successiva a seconda della versione di React.
npm install --save-dev enzima enzima-adattatore-react-16
Quindi, nel file di configurazione del test, configura Enzyme per utilizzare l'adattatore:
importa l'enzima da 'enzima'; importa l'adattatore da 'enzyme-adapter-react-16'; Enzyme.configure({ adattatore: nuovo adattatore() });
Testare i portali con l'enzima
Ora passiamo al test vero e proprio. Esistono diversi approcci che puoi adottare per testare i portali nei componenti React con Enzyme.
1. Derisione del Portale
Un modo per testare un componente che utilizza un portale è simulare la funzionalità del portale. Invece di renderizzare effettivamente i figli in un nodo DOM separato, puoi renderli direttamente nel normale metodo di rendering del componente durante il test.


Ecco un esempio di come puoi farlo:
importa React da 'react'; importa {mount} da 'enzima'; const PortalExample = ({ children, usePortal = true }) => { if (usePortal) { return ReactDOM.createPortal( children, document.getElementById('portal-root') ); } return <div>{bambini}</div>; }; description('PortalExample', () => { it('dovrebbe eseguire il rendering dei bambini quando non si utilizza il portale', () => { const wrapper = mount(<PortalExample usePortal={false}>Test Content</PortalExample>); wait(wrapper.text()).toBe('Test Content'); }); });
In questo esempio, abbiamo aggiunto autilizzarePortalprop alPortalEsempiocomponente. QuandoutilizzarePortalÈfalso, il componente esegue il rendering dei figli direttamente in a<div>invece di utilizzare un portale. In questo modo, possiamo facilmente testare la funzionalità del componente utilizzando i normali metodi di Enzyme.
2. Testare il nodo DOM del portale
Un altro approccio consiste nel testare l'effettivo nodo DOM in cui il portale esegue il rendering dei suoi figli. Per fare ciò è necessario accedere al nodo DOM e controllarne il contenuto.
importa React da 'react'; importa {mount} da 'enzima'; const PortalExample = ({ children }) => { return ReactDOM.createPortal( children, document.getElementById('portal-root') ); }; description('PortalExample', () => { it('dovrebbe eseguire il rendering dei bambini nella root del portale', () => { const PortalRoot = document.createElement('div'); PortalRoot.id = 'portal-root'; document.body.appendChild(portalRoot); const wrapper = mount(<PortalExample>Test Content</PortalExample>); wait(portalRoot.textContent).toBe('Testa contenuto'); document.body.removeChild(portalRoot); }); });
In questo esempio, creiamo un nuovo nodo DOM con l'IDradice del portalenel test, monta il componente utilizzando Enzyme, quindi controlla il contenuto del fileportaleRootnodo. Al termine del test, rimuoviamo il fileportaleRootnodo dal DOM da pulire.
Utilizzo di librerie di terze parti
Esistono anche alcune librerie di terze parti che possono semplificare il test dei portali con Enzyme. Ad esempio, il@testing-library/reactla libreria ha il supporto integrato per i portali di test. Puoi usarlo in combinazione con Enzyme per testare i tuoi componenti React in modo più efficace.
npm install --save-dev @testing-library/react
Ecco un esempio di come puoi utilizzare@testing-library/reactper testare un componente che utilizza un portale:
importa React da 'react'; importa {mount} da 'enzima'; import {render, screen} da '@testing-library/react'; const PortalExample = ({ children }) => { return ReactDOM.createPortal( children, document.getElementById('portal-root') ); }; description('PortalExample', () => { it('dovrebbe eseguire il rendering dei bambini nella root del portale', () => { const PortalRoot = document.createElement('div'); PortalRoot.id = 'portal-root'; document.body.appendChild(portalRoot); render(<PortalExample>Test contenuto</PortalExample>); wait(screen.getByText('Test Contenuto')).toBeInTheDocument(); document.body.removeChild(portalRoot); }); });
In questo esempio utilizziamo@testing-library/react'Srenderefunzione per eseguire il rendering del componente escreen.getByTextper verificare se il contenuto viene visualizzato nella root del portale.
Conclusione
Testare i portali nei componenti React con Enzyme può essere complicato, ma con il giusto approccio è sicuramente fattibile. Sia che tu scelga di deridere il portale, testare il nodo DOM del portale o utilizzare librerie di terze parti, la chiave è trovare un modo per accedere e verificare il contenuto reso dal portale.
Se sei interessato ai nostri prodotti Enzyme o hai domande sul test dei componenti React, non esitare a contattarci per una discussione sull'approvvigionamento. Siamo qui per aiutarti a ottenere il massimo da Enzyme nei tuoi progetti.
A proposito, se anche tu sei interessato agli estratti di erbe, dai un'occhiata a questi link:Wolfberry cinese nero,Caffè al CBD, EPrezzo di fabbrica dell'olio di trementina/olio di trementina di alta qualità/olio di trementina minerale.
Riferimenti
- Documentazione ufficiale React sui portali: React Team.
- Documentazione ufficiale di Enzyme: Airbnb.
- Documentazione ufficiale @testing-library/react: Testing Library Team.