交换机机箱上的iOS单元测试

交换机机箱上的iOS单元测试,ios,objective-c,unit-testing,xctest,xctestcase,Ios,Objective C,Unit Testing,Xctest,Xctestcase,我是单元测试的初学者,我想在交换机中测试我的用例,但我不知道怎么做 我有: - (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中: - (IBActi

我是单元测试的初学者,我想在交换机中测试我的用例,但我不知道怎么做

我有:

 - (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

在本例中,您实际上应该做的是为该场景编写UI测试。您的上下文和执行环境不允许您按照预期的方式基于单元测试测试代码(例如,应用程序不知道您传递给测试的任何按钮)

当然,第一个错误是你使用了

[self.viewController click:nil];
单击
功能将获得按钮的
nil
值,因此标签也将为nil

当然,你可以模仿一个按钮:

UIButton *button = [[UIButton alloc] initWith...]
button.tag = [YourEnum].Bad
[self.viewController click: button];
但这仍然会给你留下一个问题,你不知道开关最终会去哪里

解决方案(如适用): 看看UI测试


它允许您运行应用程序并模拟用户交互+您的好处是,您可以始终假设您正在使用导致
单击:
事件的实际按钮。

在不使用UI测试的情况下在直接单元测试中使用视图控制器没有什么错。事实上,我会有更多的单元测试和更少的UI测试(如果有的话)

为什么??这取决于你考试的目的。我测试的原因是为了启用重构和TDD。我需要快速可靠的测试,而不是缓慢而脆弱的测试

因此,继续编写调用视图控制器的测试。对于您的问题“我在这里做什么?”您需要验证将要采取的行动。例如,您可以测试

  • 对视图的更改
  • 对基础模型的更改
  • 使用预期数据调用下一个视图控制器
将一个IBAction方法作为多个操作的扇出是不常见的。这不必要地将它们联系在一起。对单个操作的更改可能会中断其他操作。相反,考虑创建多个iAction方法,每个操作一个


要查看如何为UIViewController编写单元测试的示例—事实上,如何对其进行TDD—请参阅我的屏幕广播。

TY关于您的答案,我不知道在哪里搜索,我将查看它;)这是正确的答案-你应该接受它;-)