用在修改 测试代码里出现无法预期其行为(比如返回数据)的相关函数时,将该函数的返回值用插桩方式修改为自定义的数据(修改方式可自定义,比如 在输入参数为多少时,才返回对应的字定义数据),以满足整块代码的单测需要。
下面是例子说明 (stub 实现基于 Kiwi 框架 https://github.com/kiwi-bdd/Kiwi):
功能是接收温度和湿度参数,通过weatherForecaster 的方法计算出对应的结果,并存入数据库。
假设 resultWithTemprature 方法是无法被测试的,那么整块代码里,可以测试的是 写入数据库的代码(write函数)
@class WeatherRecorder
-(void) writeResultToDatabaseWithTemprature:(NSInteger)temprature
humidity:(NSInteger)humidity
{
id result = [self.weatherForecaster resultWithTemprature:temprature humidity:humidity];
[self write:result];
}
为了不影响单测用例,可以改写 resultWithTemprature 的行为,返回自定义的 result,来测试数据库写入代码。
[weatherForecaster stub:@selector(resultWithTemprature:humidity:)
andReturn:someResult
withArguments:theValue(23),theValue(50)];
其实就是一个对象,它是对现有类的行为一种模拟(或是对现有接口实现的模拟),它是一种更全面更智能的 Stub。
以上面代码为例,在OC里,实际上就是将 weatherForecaster 换为自定义的mock类,从而使 resultWithTemprature 函数的行为是我们测试需要的。
样例代码:
id weatherForecasterMock **=** [WeatherForecaster **mock**];
[[weatherForecasterMock **should**] **receive**:**@selector**(**resultWithTemprature**:humidity**:**)
andReturn**:**someResult
withArguments**:**theValue(23),theValue(50)];
[weatherRecorder stub:@selector(weatherForecaster) andReturn:weatherForecasterMock];