2014-10-06 2 views
6

Я пишу модульные тесты для приложения и хочу проверить, представлен ли UIAlertController в конкретном сценарии.Проверьте, отображается ли UIAlertController в случае XCTest

-(void)testBadLogin { 
    // enter username and password in UITextFields 
    self.viewController.usernameField.text = @"[email protected]"; 
    self.viewController.passwordField.text = @"incorrect_pass"; 
    [loginButton sendActionsForControlEvents: UIControlEventTouchUpInside]; 

    // this isn't right 
    XCTAssertNotNil([self.viewController alertController], @"alertController should appear"); 
} 

Как проверить, если UIAlertController была представлена ​​в верхней части текущего вида?

ответ

5

"XCTest не предназначен для использования для тестирования компонентов пользовательского интерфейса." не является действительно точным. Я использую XCTest для почти каждого тестирования пользовательского интерфейса, и он работает отлично. Правильный ответ должен быть «Mocking».

Я бы использовал OCMock для издевательства над проверенным контроллером просмотра и «проверить», что метод presentViewController ... вызывается с контроллером предупреждения. Это аккуратное решение и прекрасно работает. (Вы даже можете игнорировать, что контроллер предупреждения передан этому методу и просто проверить, что контроллер представления прошел метод presentViewController ...)

-2

XCTest не предназначен для тестирования компонентов пользовательского интерфейса.

UIAutomation JavaScript библиотеки Используйте Apple, для этого:

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UsingtheAutomationInstrument/UsingtheAutomationInstrument.html#//apple_ref/doc/uid/TP40004652-CH20

Документы для оповещения тестирования: https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAAlertClassReference/index.html#//apple_ref/doc/uid/TP40009898

+3

Многие пользователи (и я включаю себя) хотят проверить, вызывалось ли предупреждение для функции, которую мы тестируем. Это не тестирование компонентов пользовательского интерфейса, а просто проверка функциональности. Подделка - это то, что нужно использовать для этого. –

0

Я написал обертку вокруг UIAlertController для более легкого модульного тестирования.

Вы можете проверить, если она видна

XCTAssert(testableAlert.visible) 

И вы можете также выполнить свои действия

testableAlert.simulateAction("OK") 

https://github.com/exchangegroup/TestableAlert

0

Она также может быть сделано таким образом:

Допустим, у нас есть кнопка, которая при нажатии показывает контроллер вида:

- (void) didTapButton 
{ 
    UIAlertController* c = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" 
                 preferredStyle:UIAlertControllerStyleAlert]; 
    [self presentViewController:c animated:ANIMATED completion:nil]; 
} 

Обратите внимание, что параметр ANIMATED не является «YES» или «NO». Определяется в PrefixHeader как:

#define ANIMATED (getenv("runningTests") == NULL) 

и runningTests - это переменная среды, определенная в тестовой цели. Нам не нужна анимация при выполнении тестов unit/integration.

Метод испытания выглядит следующим образом:

- (void) testButtonWillShowAlertView 
{ 
    UIApplication.sharedApplication.delegate.window.rootViewController = controller; 
    [controller.button sendActionsForControlEvents:UIControlEventTouchUpInside]; 
    XCTAssertEqualObjects(controller.presentedViewController.class, UIAlertController.class); 
} 

Важная линия

UIApplication.sharedApplication.delegate.window.rootViewController = controller; 

Apparentely, RootViewController на UIWindow должен быть установлен.

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