2013-04-23 2 views
0

Я ищу лучшие практики, советы и понимание того, как тестировать пользовательский интерфейс, который использует ограничения макета.iOS - Тестирование пользовательского интерфейса (автоматическая компоновка/ограничения компоновки)

мой взгляд контроллер подкласс отображения данных «лист уровня» - ради примера, скажем, приложение каталогов DVD-дисков и этот вид контроллер является DiscDetailViewController и вы передать его DigitalDisc экземпляр, который имеет пять строк свойств. Цель состоит в том, чтобы отобразить эти строки в ярлыках и правильно перевести все с соответствующими NSLayoutConstraint.

Я хотел бы написать серию тестов, в которых реализовано столько разумных перестановок экземпляра DigitalDisc, передаваемого в этот контроллер представления, и убедитесь, что я определил достаточные ограничения.

К примеру, у меня есть DigitalDisc экземпляр, установите его title и director свойства и подбросить его в DiscDetailViewController ... Ack! Что я должен утверждать? Я застрял!

Мотивация для тестирования заключается в предотвращении ошибок регрессии. Автоматическая компоновка (особенно в IB) непостоянна, но это не похоже на автоматическую компоновку. Я не хочу исправлять одну ошибку, чтобы каскадировать множество новых сбоев. Являются ли эти модульные тесты? Испытывают ли они тесты UIAutomation? Это что-то еще?

----- EDIT -----

Скажем, мой DigitalDisc класс определяется следующим образом:

@interface DigitalDisc : NSObject 

@property NSString *title; 
@property NSString *year; 
@property NSString *director; 
@property NSString *studio; 
@property NSString *review; 

@end 

Я хотел бы проверить, чтобы убедиться, что мой макет ограничения достаточно гибкие, чтобы позволить экземпляр DigitalDisc, который может не иметь значений в любом поле; единственным требованием является поле title. Это означает, что удаление subviews должно корректно протекать по интерфейсу. Что я подразумеваю под «правильно?»

  1. Без неоднозначных и невыполнимых ограничений (я могу проверить UIView для -hasAmbigiousLayout, но как проверить исключение, которое брошено и поймано?)
  2. Это метки расширить на несколько строк, чтобы избежать усечения
  3. Это соседние метки никогда не ближе и не дальше, чем стандартное расстояние
  4. То, что выше истинны в портретном и ландшафтном

(этого достаточно, чтобы получить меня в кроличью нору, так что я могу думать об удовлетворении некоторых других требований)


Вот некоторые насмехались экраны, которые уверены, чтобы выиграть следующий ADA

что полностью заселена DigitalDisc экземпляр будет выглядеть в контроллере представления A fully filled in <code>DigitalDisc</code>

что частично заселенной DigitalDisc экземпляр может выглядеть как в контроллере вида.

Обратите внимание, что ярлык «Год» из приведенного выше снимка снят, а ярлык «Директор» переместился вверх. Это тип спецификации/поведения, который я очень заинтересован в тестировании.

A <code>DigitalDisc</code> with only title and director

ответ

0

Я может быть недопонимание вашей проблемы, но так, как вы описали это я хотел бы посмотреть в использовании вида таблицы или представление коллекции вместо этого. Предположим, вы используете представление коллекции, источник данных знал бы, сколько ячеек и какие свойства нужно будет отображать с учетом DigitalDisc. Это легко можно тестировать без запуска интерфейса. Затем макет представления пользовательской коллекции может гарантировать, что каждая ячейка является надлежащей высотой (заданная длина текста в метке) и правильное расстояние от других ячеек. Это также можно было бы проверить на единицу.

Затем вы можете просто подключить источник данных коллекции и пользовательскую коллекцию. Возможно, сделайте пару тестов UI Automation для проверки работоспособности, если это необходимо. Но я бы постарался надавить на тестирование кромки, как вы описываете до более низких уровней тестов, которые не касаются интерфейса. Разделение, которое Apple уже поощряет с источниками данных и макетами сбора данных, похоже на хороший способ разбить вашу проблему, чтобы вы могли ее полностью протестировать.

Да, вы могли бы попытаться сделать то, что хотите, с автозапуском, но вам все равно придется вычислять высоту ярлыков, и вы будете разворачивать пользовательский интерфейс каждый раз, когда это будет медленным.

+0

Я определенно придерживался этого подхода с «статических» табличных представлений в прошлом, но было убеждено, что автоматическая компоновка была панацеей для настраиваемого макета представления в iOS 6. Предполагая, что я иду по маршруту таблицы/коллекции, делает это не кажется «немного неправильным», поскольку природа этих взглядов - показать однородные данные? – edelaney05

+0

Не беспокойтесь, ваше «немного неправильное» чувство ... хорошо ... неправильно. :) Встроенное приложение контактов - отличный пример гетерогенного представления таблицы. Причина, по которой источник данных и делегат может вернуть любой вид или размер ячейки, заключается именно в том, что они хотят разрешить любой микс и соответствие типам ячеек, которые вы хотите. В этом нет ничего плохого. –

+0

Я принял ваш совет и пошел в двух направлениях: # 1 построил объект промежуточного контроллера, который отображает свойства для индексирования путей, а # 2 использовал метод перемотки Fraser Spears с представлением коллекции. Вариант 1 был более сложным (это действительно жонглирование), и работает как NSFetchedResultsController (но свойства KVO вместо прослушивания уведомлений MOC). Вариант 2 «просто работает», потому что раздел с нулевыми элементами не отображается. Не уверен, какой из них мне больше нравится, но думал, что другие могут быть заинтересованы в подходах. – edelaney05

Смежные вопросы