MockUIAlertController 3.2.0

MockUIAlertController 3.2.0

测试已测试
语言语言 Obj-CObjective C
许可证 未声明
发布最后发布2019年2月

Jon Reid 维护。



MockUIAlertController

Build Status Coverage Status Carthage compatible CocoaPods Version Twitter Follow

MockUIAlertController 允许您模拟 iOS 弹出框和操作菜单以进行单元测试。它适用于 Swift 也适用于 Objective-C。

(对于旧的 UIAlertView 或 UIActionSheet 模拟,请使用 MockUIAlertViewActionSheet。)

不会实际显示弹出框。这意味着

  • 测试工作流程不会暂停以选择操作
  • 测试速度极快。

关于更多讨论,请查看我的博客文章 如何测试 UIAlertControllers 和控制 Swizzling

编写测试

在生产代码中我需要更改什么?

没有任何更改。

如何测试 alert 控制器?

  1. 导入 @import MockUIAlertController.h; 或将其添加到 Swift 测试目标的 bridging header 中。
  2. 在测试的 Act 阶段之前实例化 QCOMockAlertVerifier
  3. 调用代码以创建和显示您的警报或操作表。

关于警报或操作表的信息可通过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复制所有内容。