2015-11-17 24 views
0

我有这样的代码单元测试的早期回报if语句

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

如何将我的单元测试的事实,当我打电话myMethodshouldReturn;是的话,我早回来。

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

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

你有其他想法吗?

+0

我会更关心测试你的方法做它应该做什么,即如果它像'createFileIfPermitted',那么你可以测试逻辑,当你做和没有权限,并在语义上'shouldReturn'意味着你不会。我认为需要更多的背景知道你的方法应该做什么。 –

+0

我同意C.B.在这里。测试你的系统的外部接口,而不是我编辑代码的内部实现 –

+0

。所以你的意思是你会创建两个单元测试,其中shouldStartWithOptions:返回YES或NO,并确保在第一种情况下三种产品都启动,在第二种情况下,没有产品启动? –

回答

2

我将如何单元测试...

这完全取决于该方法的副作用是什么。推测这些陈述是真实的:

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

所以你测试你的“早期回报”的方式是简单地通过声明方法的预期副作用是否在执行后出现。

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

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

  1. 给定一个先决条件,观察到副作用。
  2. 给定另一个先决条件,副作用是而不是观察到。 (明确未观察到,如在缺乏的副作用观察。)

如果从方法除去有条件的,第二测试应失败,因为副作用总是被观察到。


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

  • 排列 - 定义系统
  • 法的公知的先决条件 - 执行被测试
  • 断言的代码 - 验证,该系统的预期效果,观察到

这与方法本身的实现以及与该方法的外部期望有关的一切无关。

+0

谢谢你的明确答案。 –