开关盒上的 iOS 单元测试
Posted
技术标签:
【中文标题】开关盒上的 iOS 单元测试【英文标题】:iOS Unit Test on switch case 【发布时间】:2016-03-09 13:12:27 【问题描述】:我是单元测试的初学者,我想在 switch 中测试我的案例,但我不知道该怎么做。
我有:
- (void)testClickSmiley
[self.viewController click:nil];
// Here What i do ? I use what kind of XCTest Assertions ? I want to test if it goes into "default" for example
在我的 ViewController 中:
- (IBAction)click:(id)sender
UIButton *btn = (UIButton *)sender;
switch (btn.tag)
case Bad:
// Show view Bad
break;
case Average:
// Show view Average
break;
case Good:
// Show view Bad
break;
default:
break;
当然,我不想修改我的 ViewController。
有什么想法吗? TY
【问题讨论】:
【参考方案1】:在这种情况下,您实际上应该做的是为此场景编写 UI 测试。您的上下文和执行环境不允许您以您期望的方式基于单元测试(例如,应用程序不知道您传递给测试的任何按钮)来测试您的代码。
当然首先是你用错了
[self.viewController click:nil];
click
函数将获得按钮的nil
值,因此标签也将为 nil。
当然你可以模拟一个按钮:
UIButton *button = [[UIButton alloc] initWith...]
button.tag = [YourEnum].Bad
[self.viewController click: button];
但这仍然会给您留下一个问题,即您不知道开关最终去了哪里......
解决方案(如果适用):
看看 UI 测试
https://developer.apple.com/videos/play/wwdc2015/406/
它允许您运行应用程序并模拟用户交互 + 您的好处是您始终可以假设您正在使用导致click:
事件的实际按钮。
【讨论】:
TY 给你的答案,我不知道在哪里搜索,我会看看它;) 这是正确的答案 - 你应该接受它;-)【参考方案2】:在不使用 UI 测试的情况下在直接单元测试中执行视图控制器并没有错。事实上,我会有更多个单元测试和更少个UI测试(如果有的话)。
为什么?这取决于您的测试目的。我测试的原因是让fast feedback 启用重构和TDD。我需要快速可靠的测试,而不是缓慢和脆弱的测试。
所以继续编写调用视图控制器的测试。对于你的问题,“我在这里做什么?”您验证将要采取的行动。例如,您可以测试
视图更改 对基础模型的更改 使用预期数据调用下一个视图控制器将单个 IBAction 方法用作多个操作的扇出是不常见的。这不必要地将它们联系在一起。对单个操作的更改可能会破坏其他操作。相反,考虑创建多个 IBAction 方法,每个操作一个。
要查看如何为 UIViewController 编写单元测试的示例(实际上是如何进行 TDD),请参阅我的截屏视频How to Do UIViewController TDD。
【讨论】:
以上是关于开关盒上的 iOS 单元测试的主要内容,如果未能解决你的问题,请参考以下文章