Здравейте, колеги разработчици на React! Днес ще говоря за това как да тествам падащи менюта в React компоненти с Enzyme. Като доставчик на Enzyme видях от първа ръка важността на правилното тестване в проектите на React, особено когато става въпрос за онези досадни падащи менюта.
Защо тестването на падащите менюта е важно
Падащите менюта са често срещан UI компонент в React приложенията. Те се използват за неща като избор на опции, филтриране на данни и навигация в менютата. Но те също могат да бъдат трудни за правилно. Малък бъг в падащо меню може да доведе до лошо потребителско изживяване, като например опциите да не се показват правилно или падащото меню да не се затваря, когато трябва.
Това е мястото, където се намесва тестването. Като пишете тестове за вашите падащи менюта, можете да хванете тези грешки в началото на процеса на разработка, преди да стигнат до производството. И Enzyme е страхотен инструмент за правене на точно това.
Първи стъпки с Enzyme
Преди да се потопим в падащите менюта за тестване, нека набързо да разгледаме как да настроите Enzyme във вашия проект React. Ако още не сте го направили, ще трябва да инсталирате Enzyme и неговия адаптер за React. Можете да направите това с помощта на npm или yarn:
npm install --save-dev ензим enzyme-adapter-react-16
След като инсталирате Enzyme, ще трябва да го конфигурирате да работи с вашата версия на React. Във вашия тестов инсталационен файл (обикновеноsrc/setupTests.js), добавете следния код:
импортиране на ензим от „ензим“; импортиране на адаптер от 'enzyme-adapter-react-16'; Enzyme.configure({ адаптер: нов адаптер() });
Вече сте готови да започнете да тествате!
Тестване на просто падащо меню
Нека започнем с тестване на прост падащ компонент. Ето пример за основно падащо меню в React:
импортиране на React, {useState} от 'react'; const Dropdown = () => { const [isOpen, setIsOpen] = useState(false); const options = ['Опция 1', 'Опция 2', 'Опция 3']; const toggleDropdown = () => { setIsOpen(!isOpen); }; return ( <div> <button onClick={toggleDropdown}>Превключване на падащото меню</button> {isOpen && ( <ul> {options.map((option, index) => ( <li key={index}>{option}</li> ))} </ul> )} </div> ); }; експортиране по подразбиране падащо меню;
За да тестваме това падащо меню, ще искаме да се уверим, че щракването върху бутона превключва видимостта на списъка с опции. Ето как можем да направим това с помощта на Enzyme:
импортиране на React от 'react'; импорт { плитък } от 'ензим'; импортиране на падащо меню от './Dropdown'; describe('Dropdown', () => { it('трябва да превключва падащото меню, когато се щракне върху бутона', () => { const wrapper = shallow(<Dropdown />); const button = wrapper.find('button'); // Първоначално падащото меню трябва да бъде затворено expect(wrapper.find('ul').exists()).toBe(false); // Щракнете върху бутона, за да отворите падащото меню button.simulate('click'); expect(wrapper.find()).toBe(true); // Щракнете върху бутона отново, за да затворите падащото меню button.simulate('ul').exists()).
В този тест първо използвамеплитъкза изобразяване наПадащо менюкомпонент. След това намираме бутона с помощта нанамерии симулирайте събитие с щракване с помощта насимулира. Накрая използвамесъществуваза да проверите дали списъкът с опции е видим или не.
Тестване на падащия избор
Сега нека направим нещата още една крачка напред и да тестваме избора на опция в падащото меню. Ние ще модифицираме нашитеПадащо менюкомпонент за обработка на избор на опция:
импортиране на React, {useState} от 'react'; const Dropdown = () => { const [isOpen, setIsOpen] = useState(false); const [selectedOption, setSelectedOption] = useState(null); const options = ['Опция 1', 'Опция 2', 'Опция 3']; const toggleDropdown = () => { setIsOpen(!isOpen); }; const selectOption = (опция) => { setSelectedOption(опция); setIsOpen(false); }; return ( <div> <button onClick={toggleDropdown}> {selectedOption ? selectedOption : 'Изберете опция'} </button> {isOpen && ( <ul> {options.map((option, index) => ( <li key={index} onClick={() => selectOption(option)}> {option} </li> ))} </ul> )} </div> ); }; експортиране по подразбиране падащо меню;
За да тестваме избора на опция, ще трябва да симулираме щракване върху една от опциите и да проверим дали избраната опция е актуализирана правилно. Ето теста:
импортиране на React от 'react'; импорт { плитък } от 'ензим'; импортиране на падащо меню от './Dropdown'; describe('Dropdown', () => { it('трябва да избере опция при щракване', () => { const wrapper = shallow(<Dropdown />); const button = wrapper.find('button'); // Отворете падащото меню button.simulate('click'); // Намерете първата опция и щракнете върху нея const firstOption = wrapper.find('li').first(); firstOption.simulate('click'); // Проверете дали избраната опция е актуализирана expect(wrapper.find('button').text()).toBe('Option 1');
В този тест първо отваряме падащото меню, като щракваме върху бутона. След това намираме първата опция, използвайкипървии симулирайте щракване върху него. Накрая проверяваме дали текстът на бутона е актуализиран, за да отразява избраната опция.
Тестване с по-сложни падащи менюта
В приложения от реалния свят падащите менюта могат да бъдат много по-сложни от нашите прости примери. Те може да имат вложени опции, персонализиран стил или асинхронно зареждане на данни. Когато тествате тези по-сложни падащи менюта, ще трябва да адаптирате стратегията си за тестване съответно.
Например, ако вашето падащо меню има вложени опции, ще трябва да тествате поведението както на родителските, така и на дъщерните опции. Може също да се наложи да използвате по-усъвършенствани селектори на ензими, за да намерите конкретни елементи в падащото меню.
Ако вашето падащо меню зарежда данни асинхронно, ще трябва да използвате техники катоасинхронен/изчакванеилиsetTimeoutда изчакате данните да се заредят, преди да стартирате вашите тестове. Ето пример за тестване на асинхронно падащо меню:
import React, {useState, useEffect} от 'react'; const AsyncDropdown = () => { const [isOpen, setIsOpen] = useState(false); const [опции, 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}>Превключване на падащото меню</button> {isOpen && ( <ul> {options.map((option, index) => ( <li key={index}>{option}</li> ))} </ul> )} </div> ); }; експортиране по подразбиране AsyncDropdown;
импортиране на React от 'react'; импорт { плитък } от 'ензим'; импортиране на AsyncDropdown от './AsyncDropdown'; describe('AsyncDropdown', () => { it('трябва да зареди опции, когато падащото меню е отворено', async () => { global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve(['Опция 1', 'Опция 2', 'Опция 3']), }) ); const wrapper = shallow(<AsyncDropdown/>); // Отваряне на падащия бутон.simulate('); // Проверете дали опциите са заредени.
В този тест използвамеis.fnда се подиграват наизвличамAPI и връща някои примерни данни. След това отваряме падащото меню и изчакваме опциите да се заредят с помощтаизчакайте wrapper.update(). Накрая проверяваме дали са изобразени правилният брой опции.
Заключение
Тестването на падащи менюта в компонентите на React с Enzyme е съществена част от гарантирането на качеството и надеждността на вашите приложения. Като следвате техниките, описани в тази публикация в блога, можете да напишете ефективни тестове както за прости, така и за сложни падащи менюта.
Ако търсите висококачествени ензимни продукти за вашите нужди от тестване, ние сме тук, за да ви помогнем. Предлагаме и гама от други продукти, като напрФармацевтичен клас Витамин B12 Cas 13422-55-4 Метилкобаламин на прах,Нано графенов прах с фабрична цена, иМасло от крил капсула.
Ако проявявате интерес към закупуването на някой от нашите продукти или имате въпроси, моля, не се колебайте да се свържете с нас за обсъждане на поръчката. Винаги се радваме да помогнем!


Референции
- Документация за ензима: https://enzymejs.github.io/enzyme/
- Библиотека за тестване на React: https://testing-library.com/docs/react-testing-library/intro/