Как анимация может быть проверена юнитом?

Современные пользовательские интерфейсы, особенно MacOS и iOS, имеют много «случайных» анимаций - представлений, которые появляются через короткие анимационные последовательности, в значительной степени организованные системой.

[[myNewView animator] setFrame: rect]

Иногда, у нас может быть немного более сложная анимация, что-то с анимационной группой и блоком завершения.

Теперь я могу представить отчеты об ошибках, например:

Эй, приятной анимации при появлении myNewView в новом выпуске не происходит!

Итак мы бы хотели, чтобы модульные тесты делали несколько простых вещей:

  • подтверждают, что анимация происходит
  • проверяют продолжительность анимации
  • проверяют частоту кадров анимация

Но, конечно, все эти тесты должны быть простыми для написания и не должны ухудшать код; мы не хотим испортить простоту неявных анимаций тонной управляемой тестами сложности!

Итак, , каков подход, ориентированный на TDD, для реализации тестов для случайных анимаций?


Обоснования для модульного тестирования

Давайте рассмотрим конкретный пример, чтобы проиллюстрировать, почему нам нужен модульный тест. Допустим, у нас есть представление, которое содержит кучу WidgetViews. Когда пользователь создает новый виджет двойным щелчком, он должен изначально казаться крошечным и прозрачным, увеличиваясь до полного размера во время анимации.

Это правда, что нам не нужно проводить модульное тестирование поведения системы. Но вот некоторые вещи, которые могут пойти не так, потому что мы запутались:

  1. Анимация вызывается не в том потоке и не отрисовывается. Но в ходе анимации мы вызываем setNeedsDisplay, поэтому в конечном итоге виджет отрисовывается.

  2. Мы перерабатываем неиспользуемые виджеты из пула отказавшихся WidgetControllers. НОВЫЕ WidgetViews изначально прозрачны, но некоторые представления в пуле рециркуляции остаются непрозрачными. Таким образом, исчезновение не происходит.

  3. Некоторая дополнительная анимация начинается в новом виджете до ее завершения. В результате виджет начинает появляться, а затем начинает резко дергаться и мигать, прежде чем он успокаивается.

  4. Вы внесли изменения в метод drawRect: виджета, и новый drawRect работает медленно. Старая анимация была в порядке, но теперь это беспорядок.

Все это будет отображаться в вашем журнале поддержки как «Анимация создания виджета больше не работает». И мой опыт показывает, что, как только вы привыкнете к анимации, разработчику будет очень трудно сразу заметить, что несвязанное изменение нарушило анимацию. Это рецепт для юнит-тестирования, верно?

10
задан Shog9 11 February 2013 в 18:58
поделиться