Enzyme mount: Page not found · GitHub Pages
Памятка по ферментам
Начало работы
Введение
Enzyme позволяет писать модульные тесты для компонентов React. Это руководство охватывает Enzyme 3.x.
- Веб-сайт Enzyme (enzymejs.github.io)
Крепление
import {shallow, mount} из 'enzyme'
обертка = мелкая ()
обертка = монтирование ()
Неглубокая упаковка не спускается к подкомпонентам.
Полное крепление также монтирует подкомпоненты.
См.: Поверхностный рендеринг,
Полный рендеринг
Отладка
console.log(wrap.debug())
Показывает HTML для целей отладки.
См.: отладка()
Примеры
Базовый пример
import {мелкий} из 'энзима' импортировать MyComponent из '../MyComponent'
это('работает', () => { константная обертка = мелкая () ожидать(обернуть.текст()). toEqual('Я Грут') })
Реквизит и состояние
Настройка
wrap.setProps({имя: 'Мо'}) wrap.setState({показать: правда})
Утверждение
ожидать(обернуть.prop('имя')).toEqual('Мо') ожидать(обернуть.состояние('показать')).toEqual(истина)
ожидать('имя' в wrap.props()).toEqual('Мо') ожидать('показать' в wrap.state()).toEqual(true)
Соответствующие элементы
ожидать(
wrap.containsMatchingElement(
Я грут
)
).toBeTruthy()
содержитMatchingElement()
, пожалуй, самое полезное утверждение в Jest.
снимков
ожидать(обернуть).toMatchSnapshot()
Убедитесь, что вы настроили энзим-в-json для моментальных снимков (см. Установка ниже).
Траверсы
ожидать( wrap.find('кнопка').text() ).toEqual('Отправить')
Используйте .find()
для перехода к узлам. Он также вернет объекты-оболочки.
Моделирование событий
wrap. find('ввод').simulate('щелчок')
С реквизитами объекта события
wrap.find('input').simulate('change', { цель: {значение: 'привет'} })
Установка
Первоначальная настройка
npm install --save-dev фермент \ фермент-адаптер-реагировать-16 \ Реакция-тест-рендерер
тест/setup.js
импорт фермента из «энзима» импортировать адаптер из 'enzyme-adapter-react-16' Enzyme.configure({адаптер: новый адаптер() })
package.json
"шутка": { "файлы установки": [ "тест/setup.js" ] }
Это настраивает Enzyme для React v16, а Jest автоматически настраивает Enzyme для вас. В инструкциях по установке Enzyme есть и другие адаптеры.
См.: Установка
Шуточные снимки
npm install --save-dev энзим-в-json
package.json
"шутка": { "моментальные сериализаторы": [ "энзим-в-json/сериализатор" ] }
Тест
это('работает', () => { обернуть = монтировать (<МойКомпонент/>) ожидать(обернуть). toMatchSnapshot() })
Необязательно, но рекомендуется: позволяет использовать оболочки Enzyme со снимками Jest.
См.: фермент-в-json
РеактВраппер
Траверс
wrap.find('кнопка') // → ReactWrapper wrap.filter('кнопка') // → ReactWrapper wrap.not('span') // → ReactWrapper (инверсия filter()) wrap.children() // → ReactWrapper wrap.parent() // → ReactWrapper wrap.closest('div') // → ReactWrapper wrap.childAt(0) // → ReactWrapper wrap.at(0) // → ReactWrapper wrap.first() // → ReactWrapper wrap.last() // → ReactWrapper
wrap.get(0) // → ReactElement wrap.getElement() // → ReactElement wrap.getElements() // → Массивwrap.getDOMNode() // → DOMComponent
См.: Полный API рендеринга
Действия
wrap.simulate('щелчок')
Компоненты React
wrap.setState({ ··· }) wrap.setProps({ ··· }) wrap.setContext({ ··· })
wrap.state() // получить полное состояние wrap. props() // получить полный реквизит wrap.context() // получить полный контекст
wrap.state('ключ') // → любой wrap.prop('key') // → любой wrap.context('key') // → любой
wrap.instance() // → ReactComponent
Крепление
обертка.mount() обернуть.размонтировать() wrap.update() // вызывает forceUpdate()
Тесты
wrap.debug() // → строка wrap.html() // → строка wrap.text() // → строка wrap.type() // → строка | функция wrap.name() // → строка wrap.is('.classname') // → логическое значение wrap.hasClass('класс') // → логическое значение wrap.exists() // → логическое значение wrap.contains() // → логическое значение wrap.contains([ ]) // → логическое значение wrap.some('.child') // → логическое значение wrap.someWhere(n => n.hasClass('foo')) wrap.containsMatchingElement() // → логическое значение wrap.containsAllMatchingElements([ ]) // → логическое значение wrap.containsAnyMatchingElements([ ]) // → логическое значение
Ссылки
- Веб-сайт Enzyme (airbnb. io)
- Шпаргалка Enzyme v2 (devhints.io) (старая версия)
энзим.mount Примеры кода JavaScript и Node.js
const wrapper = mount( <Страница экономии топлива действий={действий} константная оболочка = монтирование( <Страница экономии топлива действий={действий}
описать('Компонент AddToFavourites', () => { const comp =it('должен соответствовать снимку', () => { константное дерево = создать (комп).toJSON() ожидать(дерево).toMatchSnapshot() }) it('должен имитировать действие добавления в избранное при нажатии', () => { const обертка = mount(comp) wrapper. find('SecondaryButton').simulate('click', { preventDefault() {} }) }) })
описать('Компонент RefreshExplores', () => { постоянная комп = ( <Хранилище поставщика={mockStore}>Провайдер> ) it('должен соответствовать снимку', () => { константное дерево = создать (комп).toJSON() ожидать(дерево).toMatchSnapshot() }) it('должен имитировать действие обновления при нажатии', () => { const обертка = mount(comp) wrapper. find('a.exp_refresh').simulate('click', { preventDefault() {} }) }) })
описать('Компонент боковой панели', () => { const comp =пусть элемент данных beforeAll(() => (dataElement = MockDataElement())) afterAll(() => dataElement.remove()) it('должен совпадать со снимком, а администратор должен выйти из системы', () => { константное дерево = создать (комп).toJSON() ожидать(дерево).toMatchSnapshot() const обертка = mount(comp) ожидать (wrapper. find('.m_n_a_admin').exists()).toBe(true) }) it('должна имитировать действие admin-logout при нажатии', () => { dataElement.setAttribute('data-isadmin', 'true') const обертка = mount(comp) wrapper.find('.admin-logout').simulate('click', { preventDefault() {} }) }) })
описать('Компонент входа администратора', () => { пусть dataElement = MockDataElement() константа комп = ( <Хранилище поставщика={mockStore}>Провайдер> ) it('должен соответствовать снимку', () => { константное дерево = создать (комп). toJSON() ожидать(дерево).toMatchSnapshot() }) it('следует имитировать действие отправки входа в систему', () => { const обертка = mount(comp) wrapper.find('form').simulate('submit', {preventDefault() {} }) }) it('следует перенаправить на маршрут /is-admin, когда пользователь является администратором', () => { dataElement.setAttribute('data-isadmin', 'true') const wrapper = small( ) ожидать (wrapper.find('Redirect').exists()).toBe(true) }) })
обертка const = mount(comp) wrapper. find('Изображение галереи').simulate('щелчок')
const wrapper = mount(comp) wrapper.find('SecondaryButton').simulate('щелчок') }) const обертка = mount(comp) обертка .find('.t_a_tag')
описать('Компонент ExplorePhotoGallery', () => { const comp =// неглубокий снимок it('должен соответствовать снимку', () => { const tree = мелкое (комп.) ожидать(дерево).toMatchSnapshot() }) it('показать показать галерею', () => { const обертка = мелкая (комп. ) ожидать(обертка.найти('Ничего').существует()).быть(ложь) ожидать(обертка.найти('Галерея').существует()).быть(истина) ожидать(обертка.найти('Галерея').prop('фотографии').длина).toBe(1) }) it('должен показывать при нажатии на фотографию из галереи', () => { const обертка = mount(comp) wrapper.find('Изображение галереи').simulate('щелчок') пусть imgTheatre = wrapper.find('ImageTheatre') ожидать(imgTheatre.exists()).toBe(true) }) it('должен показывать когда photos.length == 0', () => { const wrapper = small( ) ожидать(обертка. найти('Ничего').существует()).быть(истина) ожидать(обертка.найти('Галерея').существует()).быть(ложь) }) })
описать('Компонент отмены подписки', () => { константные реквизиты = { пользователей: 7, отписался() {}, } it('должен соответствовать снимку', () => { const tree = create().toJSON() ожидать(дерево).toMatchSnapshot() }) it('должно имитировать отмену подписки при нажатии', () => { const wrapper = mount( ..props} store={mockStore} />) wrapper.find('PrimaryButton').simulate('щелчок') }) })
описать('Компонент заголовка', () => { const comp = <Заголовок /> it('должен соответствовать снимку', () => { константное дерево = создать (комп).toJSON() ожидать(дерево).toMatchSnapshot() }) it('должны показывать параметры при нажатии', () => { const обертка = mount(comp) ожидать (wrapper.find('HeaderOptions').exists()).toBeFalse() wrapper.find('.show_more').simulate('щелчок') ожидать (wrapper. find('HeaderOptions').exists()).toBeTrue() }) })
описать('Компонент загрузки-аватара', () => { const comp =it('должен соответствовать снимку', () => { константное дерево = создать (комп).toJSON() ожидать(дерево).toMatchSnapshot() }) it('должен имитировать событие изменения в файле', () => { const обертка = mount(comp) // событие изменения константный файл = новый большой двоичный объект (['foo'], { тип: 'текст/обычный', }) константа mockedEvent = { цель: { файлов: [файл], }, } wrapper. find('input[type="file"]').simulate('change', mockedEvent) // должен присутствовать предварительный просмотр-аватар, так как fileAvatarChanged=true ожидать (wrapper.find('PreviewAvatar').exists()).toBe(true) }) })
обертка const = mount(comp) wrapper.find('Изображение галереи').simulate('щелчок')
описать('Компонент AdvancedUnfollow', () => { константные реквизиты = { пользователь: 7, отписался() {}, } it('должен соответствовать снимку', () => { константное дерево = создать(..props} store={mockStore} /> ).toJSON() ожидать(дерево).toMatchSnapshot() }) it('должно имитировать отмену подписки при нажатии', () => { const wrapper = mount( ) wrapper.find('PrimaryButton').simulate('щелчок') }) })
описать('Следовать за компонентом', () => {
константные реквизиты = {
Детали пользователя: {
пользователей: 7,
имя пользователя: 'галиб',
имя: 'Мирза',
фамилия: 'Галиб',
},
следует() {},
}
it('должен соответствовать снимку', () => {
const tree = create(