7

我正在为应用程序编写单元测试,并想检查 aUIAlertController是否出现在特定场景中。

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

如何检查 aUIAlertController是否已显示在当前视图之上?

4

5 回答 5

5

“XCTest 并不是用来测试 UI 组件的。” 并不真正准确。我几乎在所有 UI 测试中都使用 XCTest,它工作得很好。正确答案应该是“嘲笑”。

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

于 2014-12-23T10:31:58.423 回答
1

也可以通过这种方式完成:

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

- (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;

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

于 2016-08-31T08:26:11.127 回答
0

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

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

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

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

使用 if 或 XCTAssertTrue 。

于 2019-06-20T06:42:26.723 回答
0

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

您可以检查它是否可见

XCTAssert(testableAlert.visible)

你也可以执行它的动作

testableAlert.simulateAction("OK")

https://github.com/exchangegroup/TestableAlert

于 2015-10-20T04:49:21.913 回答