0

我是单元测试的初学者,我想在 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。

有任何想法吗 ?泰

4

2 回答 2

0

在这种情况下,您实际上应该做的是为此场景编写 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:最初导致事件的实际按钮。

于 2016-03-09T14:15:54.670 回答
0

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

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

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

  • 视图的变化
  • 对基础模型的更改
  • 使用预期数据调用下一个视图控制器

将单个 IBAction 方法用作多个操作的扇出是不寻常的。这不必要地将它们联系在一起。对单个操作的更改可能会破坏其他操作。相反,请考虑创建多个 IBAction 方法,每个 action 一个

要查看如何为 UIViewController 编写单元测试的示例(实际上是如何对其进行 TDD),请参阅我的截屏视频How to Do UIViewController TDD

于 2016-03-09T17:46:52.737 回答