我正在编写应用程序的单元测试,并想检查特定情况下是否显示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
?
答案 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")
答案 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)
XCTest并不意味着用于测试UI组件。
使用Apple的UIAutomation JavaScript库: