检查UIAlertController是否在XCTest案例中呈现

时间:2014-10-06 21:00:04

标签: ios uiviewcontroller xctest uialertcontroller

我正在编写应用程序的单元测试,并想检查特定情况下是否显示UIAlertController

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

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

如何检查当前视图之上是否显示UIAlertController

5 个答案:

答案 0 :(得分:5)

“XCTest并不意味着用于测试UI组件。”不是真的准确。我正在使用XCTest进行几乎所有的UI测试,它运行得很好。正确的答案应该是“嘲弄”。

我会使用OCMock来模拟测试的视图控制器并“验证”使用警报控制器调用方法presentViewController ...这是一个简洁的解决方案,工作得很好。 (你甚至可以忽略警报控制器传递给这个方法,只测试视图控制器已经传递方法presentViewController ...)

答案 1 :(得分:1)

也可以这样做:

我们假设我们有一个按钮,当点按时会显示视图控制器:

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

请注意,ANIMATED参数不是“是”'或者没有'。它在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;

显然,必须设置UIWindow上的rootViewController。

答案 2 :(得分:0)

我已经在UIAlertController周围编写了一个包装器,以便于单元测试。

您可以检查它是否可见

XCTAssert(testableAlert.visible)

您还可以执行其操作

testableAlert.simulateAction("OK")

https://github.com/exchangegroup/TestableAlert

答案 3 :(得分:0)

您可以通过以下代码(目标c)简单地检查UIAlertController是否存在。

XCTAssertFalse(app.alerts.element.staticTexts[@"your alert message"].exists);

如果未显示警报,它将无法通过测试,否则您可以使用

app.alerts.element.staticTexts[@"your alert message"].exists 

with if或XCTAssertTrue。

答案 4 :(得分:-2)