Hej, drodzy programiści React! Dzisiaj porozmawiam o tym, jak testować listy rozwijane w komponentach React za pomocą Enzyme. Jako dostawca enzymów widziałem na własne oczy, jak ważne jest odpowiednie testowanie w projektach React, szczególnie jeśli chodzi o te irytujące menu rozwijane.
Dlaczego testowanie list rozwijanych ma znaczenie
Listy rozwijane są częstym elementem interfejsu użytkownika w aplikacjach React. Służą do wybierania opcji, filtrowania danych i poruszania się po menu. Ale ich prawidłowe wykonanie może być również trudne. Mały błąd w menu rozwijanym może powodować pogorszenie komfortu użytkowania, na przykład nieprawidłowe wyświetlanie opcji lub nie zamykanie menu w odpowiednim momencie.
W tym miejscu wkracza testowanie. Pisząc testy dla list rozwijanych, możesz wychwycić te błędy na wczesnym etapie procesu tworzenia oprogramowania, zanim trafią one do środowiska produkcyjnego. A Enzyme jest doskonałym narzędziem do zrobienia właśnie tego.
Pierwsze kroki z enzymami
Zanim zagłębimy się w menu testowe, przyjrzyjmy się szybko, jak skonfigurować Enzyme w projekcie React. Jeśli jeszcze tego nie zrobiłeś, musisz zainstalować Enzyme i jego adapter dla React. Możesz to zrobić za pomocą npm lub przędzy:
npm install --save-dev enzym enzym-adapter-reaguj-16
Po zainstalowaniu Enzyme musisz skonfigurować go tak, aby współpracował z Twoją wersją React. W pliku konfiguracyjnym testu (zwyklesrc/setupTests.js), dodaj następujący kod:
importuj enzym z „enzym”; importuj adapter z „enzyme-adapter-react-16”; Enzyme.configure({adapter: nowy Adapter() });
Teraz możesz rozpocząć testowanie!
Testowanie prostego menu rozwijanego
Zacznijmy od przetestowania prostego komponentu rozwijanego. Oto przykład podstawowego menu rozwijanego w React:
importuj reakcję, {useState } z „reaguj”; const Dropdown = () => { const [isOpen, setIsOpen] = useState(false); const opcje = ['Opcja 1', 'Opcja 2', 'Opcja 3']; const toggleDropdown = () => { setIsOpen(!isOpen); }; return ( <div> <button onClick={toggleDropdown}>Przełącz menu rozwijane</button> {isOpen && ( <ul> {options.map((option, indeks) => ( <li key={index}>{option</li> ))} </ul> )} </div> ); }; eksportuj domyślne menu rozwijane;
Aby przetestować to menu, chcemy się upewnić, że kliknięcie przycisku przełącza widoczność listy opcji. Oto jak możemy to zrobić za pomocą Enzyme:
import Reaguj z „reaguj”; importuj {płytkie} z „enzymu”; importuj listę rozwijaną z „./Dropdown”; opisz('Dropdown', () => { it('powinno przełączać listę rozwijaną po kliknięciu przycisku', () => { const wrapper = płytkie(<Dropdown />); const przycisk = wrapper.find('button'); // Początkowo menu rozwijane powinno być zamknięte oczekuj(wrapper.find('ul').exists()).toBe(false); // Kliknij przycisk, aby otworzyć menu rozwijane przycisk.simulate('kliknij'); oczekuj(wrapper.find('ul').exists()).toBe(true); // Kliknij przycisk ponownie, aby zamknąć przycisk rozwijany.simulate('click'); oczekiwaj(wrapper.find('ul').exists()).toBe(false });
W tym teście po raz pierwszy używamypłytkirenderowaćLista rozwijanaczęść. Następnie znajdujemy przycisk za pomocąznajdowaći symuluj zdarzenie kliknięcia za pomocąsymulować. Na koniec używamyistniejeaby sprawdzić, czy lista opcji jest widoczna, czy nie.
Testowanie wyboru listy rozwijanej
Pójdźmy teraz o krok dalej i przetestujmy wybór opcji z menu rozwijanego. Zmodyfikujemy naszeLista rozwijanakomponent obsługujący wybór opcji:
importuj reakcję, {useState } z „reaguj”; const Dropdown = () => { const [isOpen, setIsOpen] = useState(false); const [wybrana opcja, setSelectedOption] = useState (null); const opcje = ['Opcja 1', 'Opcja 2', 'Opcja 3']; const toggleDropdown = () => { setIsOpen(!isOpen); }; constselectOption = (opcja) => { setSelectedOption(opcja); setIsOpen(false); }; return ( <div> <button onClick={toggleDropdown}> {selectedOption ? zaznaczonaOption : 'Wybierz opcję'} </button> {isOpen && ( <ul> {options.map((option, indeks) => ( <li key={index} onClick={() => wybierzopcję(opcja)}> {opcja} </li> ))} </ul> )} </div> ); }; eksportuj domyślne menu rozwijane;
Aby przetestować wybór opcji, będziemy musieli zasymulować kliknięcie jednej z opcji i sprawdzić, czy wybrana opcja została poprawnie zaktualizowana. Oto test:
import Reaguj z „reaguj”; importuj {płytkie} z „enzymu”; importuj listę rozwijaną z „./Dropdown”; opisz('Dropdown', () => { it('powinno wybrać opcję po kliknięciu', () => { const wrapper = shallow(<Dropdown />); const przycisk = wrapper.find('button'); // Otwórz przycisk rozwijany.simulate('click'); // Znajdź pierwszą opcję i kliknij ją const FirstOption = wrapper.find('li').first(); FirstOption.simulate('click'); // Sprawdź, czy wybrana opcja została zaktualizowana. oczekuj(wrapper.find('button').text()).toBe('Opcja 1' } });
W tym teście najpierw otwieramy menu, klikając przycisk. Następnie znajdujemy pierwszą opcję za pomocąPierwszyi symuluj kliknięcie na nim. Na koniec sprawdzamy, czy tekst przycisku został zaktualizowany, aby odzwierciedlał wybraną opcję.
Testowanie z bardziej złożonymi listami rozwijanymi
W rzeczywistych aplikacjach listy rozwijane mogą być znacznie bardziej złożone niż nasze proste przykłady. Mogą mieć zagnieżdżone opcje, niestandardowy styl lub asynchroniczne ładowanie danych. Testując bardziej złożone menu rozwijane, musisz odpowiednio dostosować strategię testowania.
Na przykład, jeśli lista rozwijana zawiera zagnieżdżone opcje, musisz przetestować zachowanie zarówno opcji nadrzędnej, jak i podrzędnej. Być może będziesz musiał użyć bardziej zaawansowanych selektorów enzymów, aby znaleźć określone elementy na liście rozwijanej.
Jeśli lista rozwijana ładuje dane asynchronicznie, będziesz musiał użyć technik takich jakasynchronicznie/czekajLubustaw limit czasupoczekać na załadowanie danych przed uruchomieniem testów. Oto przykład testowania asynchronicznego menu rozwijanego:
importuj reakcję, {useState, useEffect } z „reaguj”; const AsyncDropdown = () => { const [isOpen, setIsOpen] = useState(false); const [opcje, setOptions] = useState([]); useEffect(() => { const fetchOptions = async () => { const odpowiedź = czekaj na fetch('https://api.example.com/options'); const data = oczekuj na odpowiedź.json(); setOptions(data); }; if (isOpen) { fetchOptions(); } }, [isOpen]); const toggleDropdown = () => { setIsOpen(!isOpen); }; return ( <div> <button onClick={toggleDropdown}>Przełącz menu rozwijane</button> {isOpen && ( <ul> {options.map((option, indeks) => ( <li key={index}>{option</li> ))} </ul> )} </div> ); }; eksportuj domyślne AsyncDropdown;
import Reaguj z „reaguj”; importuj {płytkie} z „enzymu”; importuj AsyncDropdown z './AsyncDropdown'; opisz('AsyncDropdown', () => { it('powinien załadować opcje po otwarciu menu', async () => { global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve(['Opcja 1', 'Opcja 2', 'Opcja 3']), }) ); const wrapper = płytkie(<AsyncDropdown />); const przycisk = wrapper.find('button'); // Otwórz przycisk rozwijany.simulate('click'); // Poczekaj na załadowanie opcji oczekuj wrapper.update(); // Sprawdź, czy opcje są załadowane oczekuj(wrapper.find('li').length).toBe(3 });
W tym teście używamyjest.fnkpić zaportowaćAPI i zwróć przykładowe dane. Następnie otwieramy menu rozwijane i czekamy na załadowanie opcji za pomocączekaj na opakowanie.update(). Na koniec sprawdzamy, czy renderowana jest poprawna liczba opcji.
Wniosek
Testowanie list rozwijanych w komponentach React za pomocą Enzyme jest istotną częścią zapewnienia jakości i niezawodności aplikacji. Postępując zgodnie z technikami opisanymi w tym poście na blogu, możesz napisać skuteczne testy zarówno dla prostych, jak i złożonych list rozwijanych.
Jeśli szukasz wysokiej jakości produktów enzymatycznych do swoich potrzeb testowych, jesteśmy tutaj, aby Ci pomóc. W naszej ofercie znajdziesz także inne produkty, jak npFarmaceutyczna witamina B12 Cas 13422-55-4 Proszek metylokobalaminy,Cena fabryczna Nano grafen w proszku, IKapsułka z olejem z kryla.
Jeśli jesteś zainteresowany zakupem któregokolwiek z naszych produktów lub masz jakiekolwiek pytania, nie wahaj się z nami skontaktować w celu omówienia zakupu. Zawsze chętnie pomożemy!


Referencje
- Dokumentacja enzymu: https://enzymejs.github.io/enzyme/
- Biblioteka testowania React: https://testing-library.com/docs/react-testing-library/intro/