Swift 单元测试 IBAction
Swift Unit Testing IBAction
我有一个 UIViewController,其中包含每个 UITextField、UIButton 和 UILabel。我在 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 源代码,我基本上需要执行以下操作:
- 将 OCMock 添加到我的测试项目中
- 创建一个 Objective-C 测试。它会像往常一样要求我桥接 header
- 导入"OCMock.h"
- 非常重要:导入 header 以访问我项目中的 swift 函数。这个 header 通常是 "ProjectName_Tests-Swift.h"
使用以下代码:
-(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 开发中最有趣的部分之一。
我有一个 UIViewController,其中包含每个 UITextField、UIButton 和 UILabel。我在 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 源代码,我基本上需要执行以下操作:
- 将 OCMock 添加到我的测试项目中
- 创建一个 Objective-C 测试。它会像往常一样要求我桥接 header
- 导入"OCMock.h"
- 非常重要:导入 header 以访问我项目中的 swift 函数。这个 header 通常是 "ProjectName_Tests-Swift.h"
使用以下代码:
-(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 开发中最有趣的部分之一。