Enzyme предоставляет несколько методов для тестирования компонентов React, включая возможность получения HTML-разметки. Эти методы позволяют разработчикам убедиться, что рендеринг компонента соответствует ожидаемому результату, а также проверить правильность отображаемых элементов. В этой главе рассмотрены основные способы получения HTML-разметки, доступные через Enzyme.
html()Метод html() используется для извлечения полной
HTML-разметки из рендера компонента. Этот метод возвращает строку,
содержащую сгенерированную HTML-разметку для всего компонента или его
части. Он позволяет сравнить рендер с ожидаемым результатом или
проанализировать, что именно рендерит компонент.
Пример использования:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('<MyComponent />', () => {
it('должен рендерить правильную HTML-разметку', () => {
const wrapper = shallow(<MyComponent />);
expect(wrapper.html()).toBe('<div><span>Hello, World!</span></div>');
});
});
В этом примере метод html() возвращает строку, которая
соответствует HTML-разметке компонента MyComponent. Это
может быть полезно при тестировании того, что компонент правильно
рендерит элементы и правильно строит структуру.
debug()Метод debug() схож с html(), но
предоставляет более подробную информацию. Он возвращает не просто строку
HTML, а подробный вывод в формате дерева компонентов. Это полезно при
отладке, когда необходимо понять, как устроен компонент и какие его
части были отрендерены.
Пример использования:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('<MyComponent />', () => {
it('должен отображать правильное дерево компонентов', () => {
const wrapper = shallow(<MyComponent />);
console.log(wrapper.debug());
});
});
Результат работы debug() может выглядеть следующим
образом:
<MyComponent>
<div>
<span>Hello, World!</span>
</div>
</MyComponent>
Метод debug() особенно полезен при тестировании сложных
компонентов с вложенной структурой, так как позволяет увидеть, как
компоненты рендерятся на разных уровнях.
render()Метод render() используется для рендеринга компонента с
помощью библиотеки cheerio, которая является серверной
альтернативой jQuery. В отличие от shallow(), который
рендерит компонент на одном уровне, render() выполняет
полное рендеринг, включая все дочерние компоненты.
Этот метод позволяет получить полную HTML-разметку компонента и всех его вложенных элементов. Он возвращает объект, который можно использовать для более сложных манипуляций с DOM.
Пример использования:
import { render } from 'enzyme';
import MyComponent from './MyComponent';
describe('<MyComponent />', () => {
it('должен рендерить полную HTML-разметку', () => {
const wrapper = render(<MyComponent />);
expect(wrapper.html()).toBe('<div><span>Hello, World!</span></div>');
});
});
Метод render() полезен, когда необходимо получить более
точное представление о рендере компонента, включая все дочерние
компоненты, так как он выполняет полный рендеринг.
shallow() и его отличие от render()Метод shallow() рендерит компонент на одном уровне, не
углубляясь в его дочерние компоненты. Это позволяет избежать сложных
рендерингов и фокусироваться только на логике самого компонента. Однако,
для более сложных компонентов с вложенной структурой
shallow() может не предоставлять полной картины.
В отличие от метода render(), shallow() не
рендерит дочерние компоненты, а вместо этого оставляет их как заглушки
(stubs). Это позволяет тестировать компоненты быстрее и с меньшими
затратами ресурсов.
Пример использования:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('<MyComponent />', () => {
it('должен рендерить компонент с дочерними элементами как заглушки', () => {
const wrapper = shallow(<MyComponent />);
console.log(wrapper.debug()); // Покажет дерево с заглушками
});
});
Использование shallow() полезно для тестирования
компонентов в изоляции, когда важна проверка только их поведения, а не
внешнего рендеринга.
ReactTestUtilsEnzyme предлагает больше возможностей для манипуляций с компонентами
по сравнению с встроенным инструментом ReactTestUtils. В
частности, Enzyme предоставляет более высокоуровневые методы, такие как
shallow(), mount(), и render(),
которые позволяют гибко управлять тем, какие части компонента рендерить
и как взаимодействовать с ними.
Enzyme также можно использовать в сочетании с тестированием снимков (snapshot testing), что помогает проверять изменения в рендеринге компонентов. Снимки сравнивают текущее состояние рендера с сохранённым ранее состоянием и позволяют легко отслеживать изменения в разметке компонента.
Пример с использованием Jest для создания снимков:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('<MyComponent />', () => {
it('должен совпадать с сохранённым снимком', () => {
const wrapper = shallow(<MyComponent />);
expect(wrapper).toMatchSnapshot();
});
});
Метод toMatchSnapshot() сравнивает текущую разметку с
предыдущим снимком и позволяет обнаруживать неожиданные изменения.
Методы получения HTML-разметки в Enzyme, такие как
html(), debug(), render() и
shallow(), предоставляют гибкие инструменты для
тестирования React-компонентов. Эти методы позволяют извлекать нужную
информацию о компоненте, от простого рендера до полного дерева
элементов, и применяются для различных целей — от проверки рендеринга до
отладки и тестирования снимков.