我是单元测试的初学者,我想在开关中测试我的情况,但我不知道该怎么做。
我有:
- (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
答案 0 :(得分:0)
在这种情况下,您实际应该做的是为此方案编写UI测试。您的上下文和执行环境不允许您根据单元测试(例如,应用程序不知道您传递给测试的任何按钮)以您期望的方式测试代码。
当然,首先出现的问题是你使用
[self.viewController click:nil];
click
函数将为按钮获取nil
值,因此标记也将为零。
当然你可以嘲笑一个按钮:
UIButton *button = [[UIButton alloc] initWith...]
button.tag = [YourEnum].Bad
[self.viewController click: button];
但这仍然会让你不知道开关最终会在哪里出现......
看看UI测试
它允许您运行应用程序并模拟用户交互+您可以随时假设您正在使用导致click:
事件的实际按钮。
答案 1 :(得分:0)
在不使用UI测试的情况下,在直接单元测试中运行视图控制器没有任何问题。事实上,我会进行更多单元测试和更少的 UI测试(如果有的话)。
为什么呢?这取决于您的测试目的。我测试的原因是让fast feedback启用重构和TDD。我需要快速可靠的测试,而不是缓慢而脆弱的测试。
所以继续编写调用视图控制器的测试。对于你的问题,“我在这做什么?”您验证将采取的操作。例如,您可以测试
将一个IBAction方法作为多个动作的扇出是不常见的。这不必要地将它们联系在一起。对单个操作的更改可能会破坏其他操作。相反,考虑创建多个IBAction方法,每个操作一个。
要查看如何为UIViewController编写单元测试的示例 - 事实上,如何TDD它 - 请参阅我的截屏视频How to Do UIViewController TDD。