2014-10-06 44 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被用來測試UI組件。」並非真正準確。我正在使用XCTest進行幾乎所有的UI測試,並且工作得很好。正確的答案是「嘲弄」。

我會使用OCMock模擬測試視圖控制器,並「驗證」方法presentViewController ...與警報控制器調用。這是一個很好的解決方案,工作得很好。 (你甚至可以忽略告警控制器傳遞給這個方法,只是測試視圖控制器已通過方法presentViewController ...)

-2
+3

許多用戶(包括我自己)都想驗證是否在我們正在測試的函數上調用了一個警報。這不是測試UI組件,而是確保功能在那裏。嘲笑是應該使用它的。 – 2015-04-20 01:06:07

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是測試目標中定義的環境變量。 我們在執行單元/集成測試時不需要動畫。

的測試方法是這樣的:

- (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,在一個UIWindow RootViewController的必須設置。

相關問題