2014-10-06 10 views
6

Ich schreibe Komponententests für eine Anwendung und möchte überprüfen, ob ein UIAlertController in einem bestimmten Szenario dargestellt wird.Überprüfen, ob UIAlertController in einem XCTest-Fall dargestellt wird

-(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"); 
} 

Wie kann ich überprüfen, ob ein UIAlertController hat oben auf der aktuellen Ansicht dargestellt worden?

Antwort

5

"XCTest nicht zu testen UI-Komponenten gemeint verwendet werden" ist nicht wirklich genau. Ich verwende XCTest für fast alle UI-Tests und es funktioniert gut. Die richtige Antwort soll "Spott" sein.

Ich würde OCMock verwenden, um den getesteten View-Controller zu verspotten und "verify", dass die Methode presentViewController ... mit dem Alert-Controller aufgerufen wird. Dies ist eine saubere Lösung und funktioniert gut. (Sie können sogar ignorieren, dass der Alert-Controller an diese Methode übergeben wird und nur testen, ob der View-Controller die Methode presentViewController bestanden hat ...)

-2
+3

Viele Benutzer (und ich schließe mich selbst ein) möchten überprüfen, ob für eine Funktion, die wir testen, eine Warnung aufgerufen wurde. Dies ist nicht Testen von UI-Komponenten, es stellt nur sicher, dass die Funktionalität vorhanden ist. Mocking ist, was dafür verwendet werden sollte. –

0

Ich habe einen Wrapper um UIAlertController geschrieben, um den Komponententest zu vereinfachen.

können Sie überprüfen, ob es

XCTAssert(testableAlert.visible) 

sichtbar und man kann auch seine Aktionen

testableAlert.simulateAction("OK") 

https://github.com/exchangegroup/TestableAlert

0

Es kann auch auf diese Weise getan werden, auszuführen:

Nehmen wir an, wir haben eine Schaltfläche, die, wenn sie angeklickt wird, View Controller zeigt:

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

Beachten Sie, dass der Parameter ANIMATED nicht 'YES' oder 'NO' ist. Es wird in PrefixHeader definieren als:

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

und runningTests ist Umgebungsvariable in Testziel definiert. Wir wollen keine Animation beim Ausführen von Unit/Integration Tests.

Das Testverfahren wie folgt aussieht:

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

Wichtige Linie

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

Apparentely ist, RootViewController auf UIWindow eingestellt werden muss.