如果声明

时间:2015-11-17 14:48:25

标签: ios objective-c unit-testing

我有这段代码

- (BOOL)shouldStartWithOptions:(Options *)options
{
    if (...) {
        return NO;
    }

    if (...) {
        return NO;
    }

    if (...) {
        return NO;
    }

    return YES;
}

- (void)startWithOptions:(Options *)options
{
    if ([self shouldStartWithOptions:options]) {
        return;
    }

    [self startProductA];
    [self startProductB];
    [self startProductC];
    // and do other stuffs
}

我如何进行单元测试,当我致电myMethod并且shouldReturn返回YES时,我会提前返回。

一个想法是期望一个方法anotherMethod不被执行但我不认为这是一个好主意,因为如果代码是对以下内容的更新,测试可以保持绿色

- (void)myMethod
{
    [self shouldReturn];
}

您还有其他想法吗?

1 个答案:

答案 0 :(得分:2)

  

我如何进行单元测试...

这完全取决于该方法的副作用。大概这些陈述是正确的:

  • self shouldStartWithOptions:为false时,该方法会在系统状态下产生一些可观察的副作用。
  • self shouldStartWithOptions:为真时,该方法不会产生副作用。

因此,测试“早期返回”的方法只是断言方法在执行后是否存在预期的副作用。

  

但我认为这不是一个好主意,因为如果代码是对以下内容的更新,测试可能会保持绿色...

在这种情况下,“早期返回”测试不应保持为绿色。考虑两个测试:

  1. 鉴于一个先决条件,观察到副作用。
  2. 鉴于另一个先决条件,副作用是被观察到。 (明显没有观察到,如在缺乏中观察到副作用。)
  3. 如果从方法中删除条件,则第二次测试应该失败,因为始终会观察到副作用。

    单元测试就是观察和验证代码对系统的影响。这些效果是返回值,还是提供的模拟调用,或系统中的其他一些改变状态......它总是相同的逻辑:

    • 安排 - 定义系统的已知前提条件
    • 法案 - 执行被测试的代码
    • 断言 - 验证对系统的预期影响是否已被观察

    这与方法本身的实现几乎没有关系,也与该方法的外部期望有关。