使用静态方法访问API是个坏主意吗?

时间:2015-04-13 21:09:47

标签: objective-c unit-testing static static-methods

假设我在名为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。这是网络数据获取方法的情况吗?或者这是一个边缘案例?

1 个答案:

答案 0 :(得分:0)

类方法只有在维持某种静态时才对可测试性有害。另一方面,无状态类方法提供了一种在其他方法之间共享过程逻辑的好方法,并且是可以测试的。它们提供了编写“辅助方法”的默认选择,例如getWithSuccess:failure:。无状态类方法绝对没有错。

  

[如果我想做什么]注入getWithSuccess:failure的替代实现?

对于系统“边缘”的方法,故事情况有所不同,这些方法负责与其他系统交换信息,访问数据以及产生其他副作用。这些是您经常要替换以进行测试的方法 - 例如,为您的系统提供“罐装”JSON消息而不是命中服务器。

尽管就代码而言,这些方法可能是无状态的,但它们并非完全无状态,因为它们要么随环境变化,要么对环境进行更改。这种“外部状态”使得这些方法对可测试性不利。