В тестировании компонентов React взаимодействие с элементами
пользовательского интерфейса является ключевым аспектом. Библиотека
React Testing Library (RTL) предоставляет утилиты для
симуляции действий пользователя, среди которых особое место занимают
функции click и dblClick. Эти методы позволяют
проверять поведение компонентов при кликах, двойных кликах и других
событиях активации элементов.
clickМетод click используется для имитации одиночного клика
на элементе. Он является основной точкой взаимодействия с кнопками,
ссылками, чекбоксами, радиокнопками и другими интерактивными
элементами.
Синтаксис:
import { fireEvent, render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
test('клик по кнопке вызывает функцию', () => {
const handleClick = jest.fn();
render(<button onCl ick={handleClick}>Нажми меня</button>);
const button = screen.getByText('Нажми меня');
fireEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
Ключевые моменты при использовании
click:
click инициирует события мыши по
цепочке:
mousedown → focus → mouseup →
click.Для элементов, поддерживающих фокус, клик автоматически устанавливает фокус на элемент.
Можно комбинировать с userEvent для более
реалистичной имитации, например, с учетом задержки между
кликами.
dblClickМетод dblClick предназначен для имитации двойного клика
мышью. Он особенно полезен при тестировании элементов с событиями
onDoubleClick.
Синтаксис:
test('двойной клик изменяет текст', () => {
const handleDoubleClick = jest.fn();
render(<div onDoubleCl ick={handleDoubleClick}>Двойной клик</div>);
const div = screen.getByText('Двойной клик');
fireEvent.dblClick(div);
expect(handleDoubleClick).toHaveBeenCalledTimes(1);
});
Особенности dblClick:
dblClick автоматически генерирует два
последовательных события click и одно
dblclick.jest.fn() и
проверяют количество вызовов для каждого события.click и dblClick| Параметр | click |
dblClick |
|---|---|---|
| Количество вызовов | 1 | 1 (но генерирует два click) |
| События мыши | mousedown, focus, mouseup,
click |
mousedown, mouseup, click,
mousedown, mouseup, click,
dblclick |
| Использование | Стандартные интерактивные действия | Элементы с onDoubleClick или специальные действия |
| Фокус | Автоматически устанавливает | Автоматически устанавливает |
Кнопки и кликабельные блоки можно тестировать на нескольких уровнях:
const handleClick = jest.fn();
fireEvent.click(button);
expect(handleClick).toHaveBeenCalled();
function ToggleButton() {
const [on, setOn] = React.useState(false);
return <button onCl ick={() => setOn(prev => !prev)}>{on ? 'Вкл' : 'Выкл'}</button>;
}
test('клик переключает состояние', () => {
render(<ToggleButton />);
const button = screen.getByText('Выкл');
fireEvent.click(button);
expect(button.textContent).toBe('Вкл');
});
function Counter() {
const [count, setCount] = React.useState(0);
return <div onDoubleCl ick={() => setCount(prev => prev + 2)}>{count}</div>;
}
test('двойной клик увеличивает счетчик на 2', () => {
render(<Counter />);
const counter = screen.getByText('0');
fireEvent.dblClick(counter);
expect(counter.textContent).toBe('2');
});
fireEvent.click.userEvent.click из
@testing-library/user-event.<input type="checkbox"> изменяет
состояние checked.<a> не вызывает реального перехода при
рендеринге в тестах; для тестирования навигации используют
MemoryRouter или мок navigate.<textarea> или
<input> может выделять текст, но в тестах достаточно
проверить вызов onDoubleClick.Важно помнить, что клик не ограничивается одним событием. Внутри
fireEvent.click(element) автоматически выполняется:
mousedownfocus (если элемент может быть сфокусирован)mouseupclickДля dblClick порядок расширяется:
mousedown → focus →
mouseup → clickmousedown → mouseup →
clickdblclickТакое понимание позволяет корректно тестировать сложные интерактивные сценарии, особенно в компонентах с разной логикой на одиночный и двойной клик.
Хотите, могу дополнительно написать раздел разница между
fireEvent и userEvent для кликов и двойных
кликов с примерами реальных приложений React. Это сильно
расширяет понимание взаимодействия с элементами.