假设我在名为MPWidget
的类中有以下代码。
// Get list of widgets from server
+ (void) getWithSuccess:(void(^)(void))success failure:(void(^)(void))failure
{
HttpClient *httpClient = [[HttpClient alloc] init];
[httpClient GET:@"http://example.com/widgets.json" success:^(void) {
NSLog(@"Great success!");
} failure:^(void) {
NSLog(@"Boo, fail!");
}];
}
上面的方法将按如下方式调用:
[MPWidget getWithSuccess:^(...) failure:^(...)];
我正在使用静态方法,如果我想从网络中获取一个(或更多),则不必实例化MPWidget
。但是,我刚刚阅读static calls are bad for testability。这是网络数据获取方法的情况吗?或者这是一个边缘案例?
答案 0 :(得分:0)
类方法只有在维持某种静态时才对可测试性有害。另一方面,无状态类方法提供了一种在其他方法之间共享过程逻辑的好方法,并且是可以测试的。它们提供了编写“辅助方法”的默认选择,例如getWithSuccess:failure:
。无状态类方法绝对没有错。
[如果我想做什么]注入
getWithSuccess:failure
的替代实现?
对于系统“边缘”的方法,故事情况有所不同,这些方法负责与其他系统交换信息,访问数据以及产生其他副作用。这些是您经常要替换以进行测试的方法 - 例如,为您的系统提供“罐装”JSON消息而不是命中服务器。
尽管就代码而言,这些方法可能是无状态的,但它们并非完全无状态,因为它们要么随环境变化,要么对环境进行更改。这种“外部状态”使得这些方法对可测试性不利。