0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>theme: gaia class:</p>
1
<p>theme: gaia class:</p>
2
<ul><li>lead</li>
2
<ul><li>lead</li>
3
<li>invert paginate: true</li>
3
<li>invert paginate: true</li>
4
</ul><h2>Dom Testing Library</h2>
4
</ul><h2>Dom Testing Library</h2>
5
<h2>Hexlet</h2>
5
<h2>Hexlet</h2>
6
<h2>Экосистема Testing Library</h2>
6
<h2>Экосистема Testing Library</h2>
7
<ul><li>dom testing library - основная библиотека</li>
7
<ul><li>dom testing library - основная библиотека</li>
8
<li>user-event - имитация браузерных событий</li>
8
<li>user-event - имитация браузерных событий</li>
9
<li>jest-dom - кастомные матчеры Jest</li>
9
<li>jest-dom - кастомные матчеры Jest</li>
10
<li>eslint-plugin-testing-library - плагин ESLint для Testing Library</li>
10
<li>eslint-plugin-testing-library - плагин ESLint для Testing Library</li>
11
<li>eslint-plugin-jest-dom - плагин ESLint для Jest DOM</li>
11
<li>eslint-plugin-jest-dom - плагин ESLint для Jest DOM</li>
12
<li>Версии для фреймворков<ul><li>react testing library</li>
12
<li>Версии для фреймворков<ul><li>react testing library</li>
13
<li>angular testing library</li>
13
<li>angular testing library</li>
14
<li>svelte testing library</li>
14
<li>svelte testing library</li>
15
</ul></li>
15
</ul></li>
16
</ul><h2>Ключевой руководящий принцип</h2>
16
</ul><h2>Ключевой руководящий принцип</h2>
17
<p>Чем лучше ваши тесты имитируют реальное использование вашего приложения, тем больше уверенности они могут вам дать</p>
17
<p>Чем лучше ваши тесты имитируют реальное использование вашего приложения, тем больше уверенности они могут вам дать</p>
18
<ul><li>тестируйте UI компоненты с точки зрения пользователя</li>
18
<ul><li>тестируйте UI компоненты с точки зрения пользователя</li>
19
<li>избегайте проверки деталей реализации</li>
19
<li>избегайте проверки деталей реализации</li>
20
<li>не полагайтесь на конкретный фреймворк для тестирования</li>
20
<li>не полагайтесь на конкретный фреймворк для тестирования</li>
21
<li>не используйте test runner</li>
21
<li>не используйте test runner</li>
22
<li>DOM Testing Library работает с любым окружением, где есть DOM API<ul><li>Jest, Mocha</li>
22
<li>DOM Testing Library работает с любым окружением, где есть DOM API<ul><li>Jest, Mocha</li>
23
<li>JSDOM</li>
23
<li>JSDOM</li>
24
<li>реальный браузер</li>
24
<li>реальный браузер</li>
25
</ul></li>
25
</ul></li>
26
</ul><h2>Запросы</h2>
26
</ul><h2>Запросы</h2>
27
<ul><li>get, getAll</li>
27
<ul><li>get, getAll</li>
28
<li>query, queryAll</li>
28
<li>query, queryAll</li>
29
<li>find, findAll</li>
29
<li>find, findAll</li>
30
</ul><h2>ByRole</h2>
30
</ul><h2>ByRole</h2>
31
<ul><li>Селектор элементов по роли</li>
31
<ul><li>Селектор элементов по роли</li>
32
<li>getByRole, getAllByRole</li>
32
<li>getByRole, getAllByRole</li>
33
<li>queryByRole queryAllByRole</li>
33
<li>queryByRole queryAllByRole</li>
34
<li>findByRole, findAllByRole</li>
34
<li>findByRole, findAllByRole</li>
35
<li>Доступные роли: link, button, form, heading, document, img, checkbox, radio, listitem, main, navigation, table, textbox</li>
35
<li>Доступные роли: link, button, form, heading, document, img, checkbox, radio, listitem, main, navigation, table, textbox</li>
36
<li>getByRole(expectedRole, { name: /submit/i })</li>
36
<li>getByRole(expectedRole, { name: /submit/i })</li>
37
<li>getByRole('checkbox', { checked: true })</li>
37
<li>getByRole('checkbox', { checked: true })</li>
38
<li>getAllByRole('button', { hidden: true })</li>
38
<li>getAllByRole('button', { hidden: true })</li>
39
</ul><h2>ByText</h2>
39
</ul><h2>ByText</h2>
40
<h2>TextMatch</h2>
40
<h2>TextMatch</h2>
41
<ul><li>как строка<ul><li>screen.getByText("Hello World") - поиск по полной строке</li>
41
<ul><li>как строка<ul><li>screen.getByText("Hello World") - поиск по полной строке</li>
42
<li>screen.getByText('llo worl', { exact: false }) - поиск по подстроке, игнорируется регистр</li>
42
<li>screen.getByText('llo worl', { exact: false }) - поиск по подстроке, игнорируется регистр</li>
43
</ul></li>
43
</ul></li>
44
<li>как регулярное выражение<ul><li>screen.getByText(/world/i) - поиск по подстроке, игнорируется регистр</li>
44
<li>как регулярное выражение<ul><li>screen.getByText(/world/i) - поиск по подстроке, игнорируется регистр</li>
45
<li>screen.getByText(/^hello world$/i) - поиск по полной строке, игнорируется регистр</li>
45
<li>screen.getByText(/^hello world$/i) - поиск по полной строке, игнорируется регистр</li>
46
</ul></li>
46
</ul></li>
47
<li>как функция<ul><li>screen.getByText((content, element) => content.startsWith("Hello"))</li>
47
<li>как функция<ul><li>screen.getByText((content, element) => content.startsWith("Hello"))</li>
48
</ul></li>
48
</ul></li>
49
</ul><ul><li>screen.getByLabelText('Username') ищет элемент с соответствющим label</li>
49
</ul><ul><li>screen.getByLabelText('Username') ищет элемент с соответствющим label</li>
50
<li>getByLabelText хорошо подходит для полей формы</li>
50
<li>getByLabelText хорошо подходит для полей формы</li>
51
<li>getByPlaceholderText ищет по атрибуту placeholder</li>
51
<li>getByPlaceholderText ищет по атрибуту placeholder</li>
52
<li>getByTitle ищет по атрибуту title</li>
52
<li>getByTitle ищет по атрибуту title</li>
53
</ul><h2>ByTestId</h2>
53
</ul><h2>ByTestId</h2>
54
<ul><li>configure({testIdAttribute: 'data-my-test-attribute'})</li>
54
<ul><li>configure({testIdAttribute: 'data-my-test-attribute'})</li>
55
</ul><p>Расширение для браузеров Chrome и Firefox Testing Playground</p>
55
</ul><p>Расширение для браузеров Chrome и Firefox Testing Playground</p>
56
<h2>Вызов событий</h2>
56
<h2>Вызов событий</h2>
57
<p>fireEvent(node: HTMLElement, event: Event)</p>
57
<p>fireEvent(node: HTMLElement, event: Event)</p>
58
<p>fireEvent[eventName](node: HTMLElement, eventProperties: Object)</p>
58
<p>fireEvent[eventName](node: HTMLElement, eventProperties: Object)</p>
59
<h2>Асинхронность</h2>
59
<h2>Асинхронность</h2>
60
<p><strong>findBy = getBy + waitFor</strong></p>
60
<p><strong>findBy = getBy + waitFor</strong></p>
61
<h2>waitFor</h2>
61
<h2>waitFor</h2>
62
<ul><li><p>await waitFor(() => screen.getByRole('alert'))</p>
62
<ul><li><p>await waitFor(() => screen.getByRole('alert'))</p>
63
</li>
63
</li>
64
<li><p>await waitFor(() => expect(mockAPI).toHaveBeenCalledTimes(1))</p>
64
<li><p>await waitFor(() => expect(mockAPI).toHaveBeenCalledTimes(1))</p>
65
</li>
65
</li>
66
<li><p>WaitForElementToBeRemoved</p>
66
<li><p>WaitForElementToBeRemoved</p>
67
</li>
67
</li>
68
<li><p>wrapper on waitFor</p>
68
<li><p>wrapper on waitFor</p>
69
</li>
69
</li>
70
</ul><ul><li>fireEvent подходит для большинства сценариев, НО</li>
70
</ul><ul><li>fireEvent подходит для большинства сценариев, НО</li>
71
<li>fireEvent.click не порождает другие события:<ul><li>fireEvent.mouseOver(element)</li>
71
<li>fireEvent.click не порождает другие события:<ul><li>fireEvent.mouseOver(element)</li>
72
<li>fireEvent.mouseMove(element)</li>
72
<li>fireEvent.mouseMove(element)</li>
73
<li>fireEvent.mouseDown(element)</li>
73
<li>fireEvent.mouseDown(element)</li>
74
<li>element.focus() (если элемент допускает это)</li>
74
<li>element.focus() (если элемент допускает это)</li>
75
<li>fireEvent.mouseUp(element)</li>
75
<li>fireEvent.mouseUp(element)</li>
76
<li>fireEvent.click(element)</li>
76
<li>fireEvent.click(element)</li>
77
</ul></li>
77
</ul></li>
78
</ul><h2>Рефакторинг</h2>
78
</ul><h2>Рефакторинг</h2>
79
<h2>user-event</h2>
79
<h2>user-event</h2>
80
<p>Это вспомогательная библиотека для Testing Library, которая обеспечивает более совершенное моделирование взаимодействия с браузером, чем встроенный метод fireEvent</p>
80
<p>Это вспомогательная библиотека для Testing Library, которая обеспечивает более совершенное моделирование взаимодействия с браузером, чем встроенный метод fireEvent</p>
81
<h2>user-event API</h2>
81
<h2>user-event API</h2>
82
<ul><li>click / dbclick</li>
82
<ul><li>click / dbclick</li>
83
<li>hover / unhover</li>
83
<li>hover / unhover</li>
84
<li>type</li>
84
<li>type</li>
85
<li>upload</li>
85
<li>upload</li>
86
<li>selectOptions / deselectOptions</li>
86
<li>selectOptions / deselectOptions</li>
87
<li>tab</li>
87
<li>tab</li>
88
<li>paste</li>
88
<li>paste</li>
89
</ul><h2>Click</h2>
89
</ul><h2>Click</h2>
90
<p>click(element, eventInit, options)</p>
90
<p>click(element, eventInit, options)</p>
91
<p>Клики по элементу, могут иметь различные побочные эффекты в зависимости от элемента</p>
91
<p>Клики по элементу, могут иметь различные побочные эффекты в зависимости от элемента</p>
92
<ul><li>Клик вызовет сначала событие hover Его можно отключить установивtrue для параметра skipHover</li>
92
<ul><li>Клик вызовет сначала событие hover Его можно отключить установивtrue для параметра skipHover</li>
93
<li>Можно также вызывать клик с зажатыми клавишаи, ctrlClick / shiftClick / пр.<ul><li>userEvent.click(elem, { ctrlKey: true, shiftKey: true })</li>
93
<li>Можно также вызывать клик с зажатыми клавишаи, ctrlClick / shiftClick / пр.<ul><li>userEvent.click(elem, { ctrlKey: true, shiftKey: true })</li>
94
</ul></li>
94
</ul></li>
95
</ul>
95
</ul>