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(
toEqual('Я Грут')
})
find('ввод').simulate('щелчок')
toMatchSnapshot()
})
props() // получить полный реквизит
wrap.context() // получить полный контекст
io)
find('SecondaryButton').simulate('click', { preventDefault() {} })
})
})
find('a.exp_refresh').simulate('click', { preventDefault() {} })
})
})
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() {} })
})
})
toJSON()
ожидать(дерево).toMatchSnapshot()
})
it('следует имитировать действие отправки входа в систему', () => {
const обертка = mount(comp)
wrapper.find('form').simulate('submit', {preventDefault() {} })
})
it('следует перенаправить на маршрут /is-admin, когда пользователь является администратором', () => {
dataElement.setAttribute('data-isadmin', 'true')
const wrapper = small(
find('Изображение галереи').simulate('щелчок')
)
ожидать(обертка.найти('Ничего').существует()).быть(ложь)
ожидать(обертка.найти('Галерея').существует()).быть(истина)
ожидать(обертка.найти('Галерея').prop('фотографии').длина).toBe(1)
})
it('должен показывать
найти('Ничего').существует()).быть(истина)
ожидать(обертка.найти('Галерея').существует()).быть(ложь)
})
})
find('HeaderOptions').exists()).toBeTrue()
})
})
find('input[type="file"]').simulate('change', mockedEvent)
// должен присутствовать предварительный просмотр-аватар, так как fileAvatarChanged=true
ожидать (wrapper.find('PreviewAvatar').exists()).toBe(true)
})
})