Как стать автором
Обновить

Два по цене одного: snapshot-тесты на основе SwiftUI Preview

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров1.9K
Всего голосов 2: ↑2 и ↓0+2
Комментарии4

Комментарии 4

Есть библиотека, которая работает по похожему принципу. Там немного другая реализация, но в целом идея такая же.

Не было проблем со всякими анимациями и загрузками после появления вью? Скажем происходит readSize от которого зависит размер других вью? Или если через секунду после появления появляется контент, то как все это отображается?

Проблем с анимациями у нас не было. Состояние загрузки в приложении показывается преимущественно с помощью скелетонов (шиммеринга), их анимация запускается на onAppear, и с ними snapshot-тесты не флакали. В Путешествиях каких-то замысловатых анимаций с изменениями размеров или перемещениями нет, поэтому тут точно ответить не смогу, но вообще в SnapshotTesting есть стратегия wait, которая должна помочь в таких случаях.

Что касается появления данных, то во время создания snapshot-теста вью никаких загрузок не начинает. В архитектуре приложения для каждого экрана явно выделен объект состояния, вью его отслеживает и отрисовывается нужным образом. Для тестов определены моковые состояния экрана, в том числе состояния с тестовыми данными, для каждого из которых создаётся новый экземпляр вью для записи скриншота. То есть переходов между разными состояниями в момент создания скриншота во вью не происходит.

Надеюсь смог ответить на вопросы :)

Привет!

Я разработчик из текущей команды Путешествий. Хочу дополнить ответ.

Вообще есть момент с анимациями. Если они запускаются в onAppear, то этот вызов не отрабатывает (это by design). Так же анимация в тесте не отработает, если использовать изменений состояния с помощью задержек (к примеру, sleep). Решение здесь - грамотный DI.
Т.к. во вьюхе значение будет изменяться, и это будет тригерить анимацию, то можно инициализировать это значение в конструкторе, с дефолтным значением (ну или задавать в ините). При этом в тесте задать финальное значение анимации.
К примеру, если во вью есть параметр @State var opacity: CGFloat, и в конструкторе он устанавливается 0.0 для начального состояния, то в тесте в инит можно передать 1.0 как финальное значение состояния. Тогда результатом будет экран, с финальным значением анимации.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий