我有这段代码
- (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];
}
您还有其他想法吗?
答案 0 :(得分:2)
我如何进行单元测试...
这完全取决于该方法的副作用。大概这些陈述是正确的:
self shouldStartWithOptions:
为false时,该方法会在系统状态下产生一些可观察的副作用。self shouldStartWithOptions:
为真时,该方法不会产生副作用。因此,测试“早期返回”的方法只是断言方法在执行后是否存在预期的副作用。
但我认为这不是一个好主意,因为如果代码是对以下内容的更新,测试可能会保持绿色...
在这种情况下,“早期返回”测试不应保持为绿色。考虑两个测试:
如果从方法中删除条件,则第二次测试应该失败,因为始终会观察到副作用。
单元测试就是观察和验证代码对系统的影响。这些效果是返回值,还是提供的模拟调用,或系统中的其他一些改变状态......它总是相同的逻辑:
这与方法本身的实现几乎没有关系,也与该方法的外部期望有关。