MockUIAlertController
MockUIAlertController 允许您模拟 iOS 弹出框和操作菜单以进行单元测试。它适用于 Swift 也适用于 Objective-C。
(对于旧的 UIAlertView 或 UIActionSheet 模拟,请使用 MockUIAlertViewActionSheet。)
不会实际显示弹出框。这意味着
- 测试工作流程不会暂停以选择操作
- 测试速度极快。
关于更多讨论,请查看我的博客文章 如何测试 UIAlertControllers 和控制 Swizzling。
编写测试
在生产代码中我需要更改什么?
没有任何更改。
如何测试 alert 控制器?
- 导入
@import MockUIAlertController.h;
或将其添加到 Swift 测试目标的 bridging header 中。 - 在测试的 Act 阶段之前实例化
QCOMockAlertVerifier
。 - 调用代码以创建和显示您的警报或操作表。
关于警报或操作表的信息可通过QCOMockAlertVerifier获取。
例如,以下是验证标题(以及警报确实一次性展示)的测试。在测试用例中的`sut`表示待测试系统。
func test_showAlert_alertShouldHaveTitle() {
let alertVerifier = QCOMockAlertVerifier()
sut.showAlert() // Whatever triggers the alert
XCTAssertEqual(alertVerifier.presentedCount, 1, "presented count")
XCTAssertEqual(alertVerifier.title, "Hello!", "title")
}
- (void)test_showAlert_alertShouldHaveTitle {
QCOMockAlertVerifier *alertVerifier = [[QCOMockAlertVerifier alloc] init];
[sut showAlert]; // Whatever triggers the alert
XCTAssertEqual(alertVerifier.presentedCount, 1, @"presented count");
XCTAssertEqualObjects(alertVerifier.title, @"Hello!", @"title");
}
为了防止测试意外展示实际警报,建议在测试用例中把警报验证器放在setUp()
/tearDown()
中。
private var alertVerifier: QCOMockAlertVerifier!
override func setUp() {
super.setUp()
alertVerifier = QCOMockAlertVerifier()
}
override func setUp() {
alertVerifier = nil
super.tearDown()
}
如何调用与UIAlertAction关联的块?
通过上述步骤使用QCOMockAlertController
来展示警报或操作表。然后在您的QCOMockAlertVerifier
上调用executeActionForButton(withTitle:)
,传入按钮的标题。例如:
func test_executingActionForOKButton_shouldDoSomething() {
let alertVerifier = QCOMockAlertVerifier()
sut.showAlert()
alertVerifier.executeActionForButton(withTitle: "OK")
// Now assert what you want
}
- (void)test_executingActionForOKButton_shouldDoSomething {
QCOMockAlertVerifier *alertVerifier = [[QCOMockAlertVerifier alloc] init];
[sut showAlert];
[alertVerifier executeActionForButtonWithTitle:@"OK"];
// Now assert what you want
}
如何测试使用DispatchQueue.main展示的警报?
在您的测试用例中创建一个期待。在警报验证器的完成块中完成它。在验证阶段的开始处添加一个短暂等待。
func test_showAlertOnMainDispatchQueue_shouldDoSomething() {
let alertVerifier = QCOMockAlertVerifier()
let expectation = self.expectation(description: "alert presented")
alertVerifier.closure = { expectation.fulfill() }
sut.showAlert()
waitForExpectations(timeout: 0.001)
// Now assert what you want
}
我能看到一些示例吗?
在Swift和Objective-C中都有示例应用。在手机和平板上运行它们以查看它们的功能,然后阅读ViewController测试。
将其添加到您的项目中
Swift使用
对于Swift,请添加:
@import MockUIAlertController;
将该桥接头导入到您的测试目标中。如果您没有将其作为单独的模块,则使用以下代码 nimport "MockUIAlertController.h"
CocoaPods
将以下内容添加到您的Podfile中,将"MyTests"更改为您测试目标的名字
target 'MyTests' do
inherit! :search_paths
pod 'MockUIAlertController', '~> 3.0'
end
Carthage
将以下内容添加到您的Cartfile中
github "jonreid/MockUIAlertController" ~> 3.0
自己构建
确保从Source/MockUIAlertController复制所有内容。