Swift 单元测试 IBAction

Swift Unit Testing IBAction

我有一个 UIViewController,其中包含每个 UITextFieldUIButtonUILabel。我在 UITextField 中放了一些东西,按下一个按钮,字符串现在在 UILabel.

中大写了

我的问题是:如何在 Swift 中设置 IBAction 以进行单元测试?如果无法测试 Swift 中的操作,我还能做些什么来测试它?

单元测试不是为了测试可视化界面而设计的。它是用来测试您的代码的。

为了测试界面,您可以使用Apple's UI Automation tool或其他外部工具。

在单元测试领域,最困难的工作可能是 UI 测试。因此,您可以做的是检查 API.

中可用的内容

您不能像 phone 用户那样切换操作或事件。因此,您必须以编程方式切换操作或事件才能对其进行测试。您还必须自己以编程方式初始化 UI 元素。

IBAction只是一个指示器告诉UIStoryboard这是一个连接器方法,你可以忽略并将其视为常规方法。

我个人尝试模拟 class 并发送以下代码:

controllerMock.btnNoResults.sendActionsForControlEvents(UIControlEvents.TouchUpInside)

问题是没有对模拟进行调用,因此测试无用。

在 Objective-C 中使用 OCMock 执行的相同方法非常有效,所以我所做的是混合 swift 测试和 Objective-C 测试。

为了设置 Objective-C 测试来测试 swift 源代码,我基本上需要执行以下操作:

  1. 将 OCMock 添加到我的测试项目中
  2. 创建一个 Objective-C 测试。它会像往常一样要求我桥接 header
  3. 导入"OCMock.h"
  4. 非常重要:导入 header 以访问我项目中的 swift 函数。这个 header 通常是 "ProjectName_Tests-Swift.h"
  5. 使用以下代码:

    -(void) testSeeMoreInformationAction{
        id mock = [OCMockObject partialMockForObject:pController];
        [[mock expect]seeMoreInformation];
    
        [pController.btnSeeMoreDetails sendActionsForControlEvents:UIControlEventTouchUpInside];
    
        [mock verify];
    }
    

像这样我的测试成功了。另外,将 Objective-C 与 Swift 混合使用并添加 OCMock 的好处是,您现在可以更轻松地测试许多其他内容。请注意,当您使用 OCMock 和 Swift 时,它仅适用于 iOS SDK 函数,它不会很好地与您 swift 函数一起使用。

这是另一个对 AlertView 非常有用的 OCMock 测试示例:

- (void)testLoginShowsAlertViewWhenNoUserNameAndPassword{
    pController.txtUserName.text = @"";
    pController.txtPassword.text = @"";
    id mock = [OCMockObject partialMockForObject:pController];
    [[mock expect]presentViewController:OCMOCK_ANY animated:YES completion:nil];

    [pController loginAction];

    [mock verify];
}

如果您需要进一步的单元测试帮助,请随时与我联系。我认为这是 swift 开发中最有趣的部分之一。