Hej där, andra React-utvecklare! Idag ska jag prata om hur man testar dropdowns i React-komponenter med enzym. Som enzymleverantör har jag själv sett vikten av korrekt testning i React-projekt, särskilt när det kommer till de där irriterande rullgardinsmenyn.
Varför det är viktigt att testa dropdowns
Dropdowns är en vanlig UI-komponent i React-applikationer. De används för saker som att välja alternativ, filtrera data och navigera i menyer. Men de kan också vara knepiga att få rätt. En liten bugg i en rullgardinsmeny kan leda till en dålig användarupplevelse, som att alternativen inte visas korrekt eller att rullgardinsmenyn inte stängs när den borde.
Det är där testning kommer in. Genom att skriva tester för dina rullgardinsmenyer kan du fånga dessa buggar tidigt i utvecklingsprocessen, innan de når produktionen. Och enzym är ett utmärkt verktyg för att göra just det.
Komma igång med enzym
Innan vi dyker in i testrullgardinsmenyn, låt oss snabbt gå igenom hur du ställer in Enzyme i ditt React-projekt. Om du inte redan har gjort det måste du installera Enzyme och dess adapter för React. Du kan göra detta med npm eller garn:
npm install --save-dev enzym enzyme-adapter-react-16
När du har installerat Enzyme måste du konfigurera den för att fungera med din React-version. I din testinstallationsfil (vanligtvissrc/setupTests.js), lägg till följande kod:
importera enzym från 'enzym'; importera Adapter från 'enzyme-adapter-react-16'; Enzyme.configure({ adapter: new Adapter() });
Nu är du redo att börja testa!
Testar en enkel dropdown
Låt oss börja med att testa en enkel rullgardinskomponent. Här är ett exempel på en grundläggande rullgardinsmeny i React:
importera React, { useState } från 'react'; const Dropdown = () => { const [isOpen, setIsOpen] = useState(false); const options = ['Alternativ 1', 'Alternativ 2', 'Alternativ 3']; const toggleDropdown = () => { setIsOpen(!isOpen); }; return ( <div> <button onClick={toggleDropdown}>Växla rullgardinsmenyn</button> {isOpen && ( <ul> {options.map((option, index) => ( <li key={index}>{option}</li> ))} </ul> )} </div> ); }; export standard dropdown;
För att testa den här rullgardinsmenyn vill vi se till att genom att klicka på knappen växlar synligheten för alternativlistan. Så här kan vi göra det med hjälp av enzym:
importera Reagera från 'reagera'; importera { grunt } från 'enzym'; importera dropdown från './Dropdown'; describe('Dropdown', () => { it('ska växla rullgardinsmenyn när du klickar på knappen', () => { const wrapper = grunt(<Dropdown />); const button = wrapper.find('button'); // Inledningsvis bör rullgardinsmenyn stängas förvänta(wrapper.find('ul')). button.simulate('click'); expect(wrapper.find('ul').exists()).toBe(true) för att stänga dropdown-knappen.simulate('ul').
I detta test använder vi förstgrundatt återgeDropdownkomponent. Sedan hittar vi knappen med hjälp avhittaoch simulera en klickhändelse med hjälp avsimulera. Slutligen använder vifinnsför att kontrollera om alternativlistan är synlig eller inte.
Testa rullgardinsval
Låt oss nu ta saker ett steg längre och testa valet av ett alternativ i rullgardinsmenyn. Vi kommer att modifiera vårDropdownkomponent för att hantera val av alternativ:
importera React, { useState } från 'react'; const Dropdown = () => { const [isOpen, setIsOpen] = useState(false); const [selectedOption, setSelectedOption] = useState(null); const options = ['Alternativ 1', 'Alternativ 2', 'Alternativ 3']; const toggleDropdown = () => { setIsOpen(!isOpen); }; const selectOption = (option) => { setSelectedOption(option); setIsOpen(false); }; return ( <div> <button onClick={toggleDropdown}> {selectedOption ? selectedOption : 'Välj ett alternativ'} </button> {isOpen && ( <ul> {options.map((option, index) => ( <li key={index} onClick={() => välj Alternativ(option)}> </ul>>) }) </li> }); }; export standard dropdown;
För att testa valet av alternativ måste vi simulera ett klick på ett av alternativen och kontrollera om det valda alternativet är korrekt uppdaterat. Här är testet:
importera Reagera från 'reagera'; importera { grunt } från 'enzym'; importera dropdown från './Dropdown'; describe('Dropdown', () => { it('ska välja ett alternativ när du klickar på det', () => { const wrapper = grunt(<Dropdown />); const button = wrapper.find('button'); // Öppna rullgardinsmenyn button.simulate('click'); // Hitta det första alternativet och klicka på det const firstOption ='wrapp'er). firstOption.simulate('click'); // Kontrollera om det valda alternativet är uppdaterat expect(wrapper.find('button').text()).toBe('Option 1');
I det här testet öppnar vi först rullgardinsmenyn genom att klicka på knappen. Sedan hittar vi det första alternativet med hjälp avförstaoch simulera ett klick på den. Slutligen kontrollerar vi om texten på knappen har uppdaterats för att återspegla det valda alternativet.
Testa med mer komplexa dropdowns
I verkliga applikationer kan rullgardinsmenyn vara mycket mer komplex än våra enkla exempel. De kan ha kapslade alternativ, anpassad stil eller asynkron dataladdning. När du testar dessa mer komplexa rullgardinsmenyer måste du anpassa din teststrategi därefter.
Till exempel, om din rullgardinsmeny har kapslade alternativ, måste du testa beteendet hos både förälder- och underordnade alternativ. Du kan också behöva använda mer avancerade enzymväljare för att hitta specifika element i rullgardinsmenyn.
Om din rullgardinsmeny laddar data asynkront måste du använda tekniker somasynkronisera/väntaellersetTimeoutvänta på att data laddas innan du kör dina tester. Här är ett exempel på att testa en asynkron rullgardinsmeny:
importera React, { useState, useEffect } från 'react'; const AsyncDropdown = () => { const [isOpen, setIsOpen] = useState(false); const [options, setOptions] = useState([]); useEffect(() => { const fetchOptions = async () => { const response = await fetch('https://api.example.com/options'); const data = await response.json(); setOptions(data); }; if (isOpen) { fetchOptions(); } }, [isOpen]); const toggleDropdown = () => { setIsOpen(!isOpen); }; return ( <div> <button onClick={toggleDropdown}>Växla rullgardinsmenyn</button> {isOpen && ( <ul> {options.map((option, index) => ( <li key={index}>{option}</li> ))} </ul> )} </div> ); }; export standard AsyncDropdown;
importera Reagera från 'reagera'; importera { grunt } från 'enzym'; importera AsyncDropdown från './AsyncDropdown'; describe('AsyncDropdown', () => { it('bör ladda alternativ när rullgardinsmenyn öppnas', async () => { global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve(['Alternativ 1', 'Alternativ 2']'), 'app}'), 'app} grunt(<AsyncDropdown />);
I detta test använder viis.fnatt hånahämtaAPI och returnera några exempeldata. Sedan öppnar vi rullgardinsmenyn och väntar på att alternativen ska laddas medawait wrapper.update(). Slutligen kontrollerar vi om rätt antal alternativ återges.
Slutsats
Att testa dropdowns i React-komponenter med Enzyme är en viktig del för att säkerställa kvaliteten och tillförlitligheten hos dina applikationer. Genom att följa teknikerna som beskrivs i det här blogginlägget kan du skriva effektiva tester för både enkla och komplexa rullgardinsmenyer.
Om du letar efter högkvalitativa enzymprodukter för dina testbehov är vi här för att hjälpa dig. Vi erbjuder även en rad andra produkter, som t.exPharmaceutical Grade Vitamin B12 Cas 13422-55-4 Methylcobalamin Pulver,Fabrikspris Nanografenpulver, ochKrilloljekapsel.
Om du är intresserad av att köpa någon av våra produkter eller har några frågor, tveka inte att kontakta oss för en upphandlingsdiskussion. Vi hjälper alltid gärna till!


Referenser
- Enzymdokumentation: https://enzymejs.github.io/enzyme/
- React Testing Library: https://testing-library.com/docs/react-testing-library/intro/