JS: Dom Testing Library
Теория: Появление и Пропадание
Взаимодействие пользователя с сайтами в браузере реализовано по событийной модели, то есть сайт реагирует на возникающие события, причем делает это асинхронно. Не существует гарантии что событие было правильно обработано или что обработка закончилась. Более того, в обработке может находиться одновременно несколько событий. Сделано это для того, чтобы возникающие события не блокировали работу с сайтом. Ни один пользователь бы не выдержал заморозки всей страницы после каждого изменения.
Как это часто бывает, то что хорошо пользователям, усложняет жизнь программистам. Крестики-нолики, которые мы тестируем, умеют взаимодействовать с бекендом. Если в конструктор класса TicTacToe передать адрес, то после заполнения формы с именами и выявления победителя, игра будет отправлять информацию об этом по указанному адресу.
Как только мы сделаем это изменение, то наш код сразу завершиться с ошибкой.
Из вывода видно, что в случае отправки данных на бекенд, обработка события стала работать асинхронно и текст приглашающий первого пользователя начать игру не появился на экране. И когда он появится мы не знаем, может почти сразу, а может, в случае задержек сети, и через 5 секунд.
Подобная ситуация, в реальных приложениях встречается на каждом шагу, поэтому для нее есть стандартное решение. Оно сводится к тому, что мы не просто проверяем изменение, а мы выполняем постоянный опрос "появилось ли?". Если точнее, это делаем не мы сами, а наш тестовый фреймворк. В Testing Library для этого используется функция waitFor():
Функция waitFor() запускает проверки каждые 50 миллисекунд (interval) в течении одной секунды (timeout). Если утверждение так и не выполнится, то возникнет ошибка. Обычно 1 секунды должно хватать для любого действия в тесте. Если это не так, то нужно разбираться.
waitFor() проверяет именно выполнение матчеров (expect()), для других задач, например поиска элементов, используются другие механизмы.
findby && findAllBy
Ожидания бывают нужны не только для проверок, но и при поиске элементов, после асинхронных действий. В этом случае вместо getBy и getAllBy используются соответственно findBy и findAllBy. В остальном их поведение идентично.
Рекомендуемые программы
Завершено
0 / 7

