Юнит-тестирование в Inferno направлено на проверку отдельных компонентов на корректность работы их логики, рендеринга и взаимодействия с состоянием. Основная цель — выявление ошибок на уровне отдельного блока приложения до интеграции с другими компонентами.
Каждый тест обычно состоит из трех этапов: подготовка, выполнение и проверка результата.
Подготовка (Arrange) Здесь создаются необходимые
данные, свойства (props) и состояние (state)
компонента. Для компонентов Inferno это может включать создание
mock-функций или начального состояния хранилища.
Выполнение (Act) Выполняются действия, которые нужно протестировать. В Inferno это может быть рендеринг компонента с определенными пропсами, вызов методов компонента или имитация событий, таких как клики или изменения формы.
Проверка (Assert) Сравнивается результат выполнения с ожидаемым поведением. Например, проверка рендера виртуального DOM, состояния компонента после события или вызова функции обратного вызова.
Для юнит-тестирования компонентов Inferno чаще всего используются следующие инструменты:
Inferno предоставляет функцию render и
createVNode, что позволяет создавать виртуальный DOM для
тестов:
import { render } from 'inferno';
import { createVNode } from 'inferno-create-element';
import { MyComponent } from './MyComponent';
const container = document.createElement('div');
render(<MyComponent prop1="test" />, container);
expect(container.textContent).toContain('test');
createVNode позволяет создавать виртуальные узлы без
полноценного рендеринга, что ускоряет тесты и делает их более
изолированными.
Shallow-тестирование изолирует компонент от его дочерних элементов, позволяя проверить только собственную логику компонента:
import { shallow } from 'inferno-test-utils';
import { MyComponent } from './MyComponent';
const wrapper = shallow(<MyComponent prop1="value" />);
expect(wrapper.find('button').length).toBe(1);
Проверяется наличие элементов, их свойства и базовые события без необходимости рендерить весь поддерево компонентов.
Для проверки реакций на пользовательские действия используются имитации событий:
import { render } from 'inferno';
import { MyButton } from './MyButton';
const container = document.createElement('div');
const onClickM ock = jest.fn();
render(<MyButton onCl ick={onClickMock} />, container);
container.querySelector('button').click();
expect(onClickMock).toHaveBeenCalled();
Можно тестировать любые события: click,
input, change, keydown, а также
вызовы методов жизненного цикла.
Inferno поддерживает жизненный цикл компонентов, включая методы
componentDidMount, componentDidUpdate и
componentWillUnmount. Эти методы можно тестировать с
использованием мок-функций и проверки состояния после рендеринга:
import { render } from 'inferno';
import { LifecycleComponent } from './LifecycleComponent';
const container = document.createElement('div');
const instance = render(<LifecycleComponent />, container);
expect(instance.state.loaded).toBe(true);
Особое внимание уделяется корректному вызову методов при изменении пропсов и состоянии, чтобы убедиться, что побочные эффекты выполняются правильно.
Компоненты часто используют внешние сервисы или контекст. Для юнит-тестов такие зависимости заменяются моками, чтобы тестировать компонент изолированно:
jest.mock('../api', () => ({
fetchData: jest.fn(() => Promise.resolve({ data: 'mocked' }))
}));
Это позволяет проверять реакцию компонента на различные сценарии без обращения к реальной сети.
beforeEach и afterEach для
подготовки и очистки окружения тестов.import { render } from 'inferno';
import { MyForm } from './MyForm';
const container = document.createElement('div');
const onSubmitM ock = jest.fn();
render(<MyForm onSub mit={onSubmitMock} />, container);
const input = container.querySelector('input');
input.value = 'Hello';
input.dispatchEvent(new Event('input'));
const form = container.querySelector('form');
form.dispatchEvent(new Event('submit'));
expect(onSubmitMock).toHaveBeenCalledWith({ text: 'Hello' });
expect(container.querySelector('input').value).toBe('');
В этом примере проверяется корректная работа формы: изменение
состояния через input, вызов обработчика
onSubmit и сброс поля после отправки.
Юнит-тестирование компонентов Inferno строится на принципах изоляции, предсказуемости и проверки конкретного поведения. Комбинация рендеринга виртуального DOM, мокирования зависимостей и имитации событий позволяет создавать быстрые и надежные тесты, обеспечивающие стабильность приложения на этапе разработки.