Как перья iPhone можно тестировать с помощью логических тестов? - PullRequest
0 голосов
/ 08 июля 2010

Модульное тестирование View Controllers представляется очень важной частью разработки iPhone ( см. Эту статью ).Это, однако, требует инициализации контроллеров из Nib, что я считаю невозможным сделать правильно в логическом тесте.

Загрузка ресурсов из пакета (см. Этот вопрос) в логическом тестеработает отлично.Даже загрузка перьев возможна так:

    UntitledViewController* controller = [[UntitledViewController alloc]initWithNibName:nil bundle:[NSBundle bundleForClass:[self class]]];

.Однако он работает только до тех пор, пока перо содержит только UIViews .Другие представления (я пробовал UITableView и UISwitch) приводят к сбою проверки с кодом 138.

Можно ли проверить мои Nib с помощью логических тестов, и если да, то как?

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Это зависит от того, что вы пытаетесь проверить.Если вы хотите убедиться, что ваши привязки настроены правильно, прочитайте статью Криса Хансона о модульном тестировании интерфейса Cocoa .Лично я считаю, что это излишне и приводит к увеличению количества тестового кода, который не очень полезен.Но это только мои 2 цента.

Если вы на самом деле попытаетесь взаимодействовать с этими элементами интерфейса в своем тесте, вы даже столкнетесь с множеством ошибок тестирования, как вы обнаружили, особенно с UIActionSheets и UITableViews.Ваша цель должна состоять в модульном тестировании поведения вашего контроллера, а не поведения объектов пользовательского интерфейса Apple.Лучшее, что я нашел, - это использовать OCMock для проверки элементов интерфейса и проверки того, что контроллер выполняет ожидаемые вызовы для них.Вот несколько примеров:

  -(void)testClickingAButtonHidesAView {
     //setup
     id mockViewToHide = [OCMockObject mockForClass:[UIView class]];
     [[mockViewToHide expect] setHidden:YES];
     [controller setSomeView:mockViewToHide];

     // hideButtonClicked is an IBAction that is the hide button's target
     [controller hideButtonClicked];
     [mockViewToHide verify];
  }

  -(void)testActionSheetPublishClick {
     // ModelManager is the controller's dependency, which publishes Items
     id mockModelManager = [OCMockObject mockForClass:[ModelManager class]];
     [controller setModelManager:mockModelManager];

     // this doesn't really need to be mocked, but it's a convenient way to create
     // a reference you can validate in expect:
     id mockItem = [OCMockObject mockForClass:[Item class]];
     [controller setCurrentItem:mockItem];

     // when the user clicks "Publish" (the first button on the action sheet), 
     // the controller should publish the current item
     [[mockModelManager expect] publishItem:mockItem];

     // stub object so I know which action sheet was clicked
     id mockPublishActionSheet = [OCMockObject mockForClass:[UIActionSheet class]];
     [controller setPublishConfirmation:mockPublishActionSheet];

     // simulate action sheet click
     [controller actionSheet:mockPublishActionSheet didDismissWithButtonIndex:0];

     [mockModelManager verify];
  }
0 голосов
/ 04 апреля 2011

Вместо этого используйте тесты приложений и проведите / проверьте свой интерфейс на устройстве.

...