2013-02-10 64 views
4

我有一个iOS应用程序正在工作,它连接到第三方Web服务。我有大约50个不同的调用,并且想用Kiwi编写单元测试,但是我不知道从哪里开始。如何使用AFNetworking进行单元测试api调用

由于我不负责API,我只需使用正确的GET或POST方法检查我的电话是否指向了正确的URL。

有什么办法可以正确地测试这个吗?

继承人我的电话的一个示例:

+ (void)listsForUser:(NSString *)username 
      response:(void (^)(NSArray *lists))completion 
{ 
    NSString *path = [NSString stringWithFormat:@"user/list.json/%@/%@", TRAKT_API_KEY, username]; 
    [TNTraktAPIManager requestWithMethod:GET 
            path:path 
           parameters:nil 
           callback:^(id response) { 
            completion(response); 
           }]; 
} 

如果设置助手类shouldEventually期望和使用receive:(SEL)withArguments:(id)...形式,然后调用下面的辅助方法,

+ (void)requestWithMethod:(HTTPMethod)method 
        path:(NSString *)path 
       parameters:(NSDictionary *)params 
       callback:(void (^)(id response))completion 
{ 
    NSString *methodString = @"POST"; 
    if (method == GET) { 
     methodString = @"GET"; 
    } 


    // Setup request 
    NSURLRequest *request = [[TraktAPIClient sharedClient] requestWithMethod:methodString 
                     path:path 
                    parameters:params]; 

    // Setup operation 
    AFJSONRequestOperation *operation = 
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                success:^(NSURLRequest *request, 
                   NSHTTPURLResponse *response, 
                   id JSON) { 
                 id jsonResults = JSON; 
                 completion(jsonResults); 

                } failure:^(NSURLRequest *request, 
                   NSHTTPURLResponse *response, 
                   NSError *error, 
                   id JSON) { 

                 id jsonResults = JSON; 
                 completion(jsonResults); 
                 NSLog(@"%s: error: %@", __PRETTY_FUNCTION__, error); 

                }]; 
    // TODO: Queue operations 
    [operation start]; 

} 
+0

关于使用Kiwi和AFImageDownloader的相关文章http://ashfurrow.com/blog/unit-testing-objective-c-using-kiwi – 2013-02-10 16:16:59

回答

5

你可以检查收到的参数是你所期望的。

两个值得了解的问题是在之前设置期望值拨打电话;并使用shouldEventually表格而不是should,以便测试延迟足够长的时间以进行呼叫。

+0

很高兴知道。之后我正在设定预期! – squarefrog 2013-02-20 09:46:07

+2

这是一个容易犯的错误。如果我每次都做了$ currencyUnit $ ... ...! – TimD 2013-02-21 10:33:20

4

我强烈建议检查出OHHTTPStubs进行单元测试您的API类。

单元测试应该是确定性的,并且将互联网添加一个潜在的不可预知API到混合环境中会使得测试条件不确定。

OHTTPStubs将允许您存储对传出HTTP请求的响应。基本上,它拦截你的HTTP流量,并且如果请求符合你设置的标准,它会给出你用JSON声明的预先存储的响应(而不是来自API的不可预知的结果)。这使您可以在测试类中配置不同的响应场景:即。 404错误,部分响应数据等等,以便在您的测试中使用。

下面是一个例子:

我创造了这个JSON存根并保存为JSON文件:

{ 
    "devices" :  [ 
        { 
        "alarm" :   { 
        "alarm_id" : 1, 
        "attack_time" : "<null>", 
        "defined_time" : "2014-04-14T04:21:36.000Z", 
        "device_id" : 7, 
        "is_protected" : 0 
        }, 
        "device_type" : "iPhone", 
        "id" : 7, 
        "os_version" : "7.1" 
        } 
        ], 
    "email" : "[email protected]", 
    "facebook_id" : 5551212, 
    "id" : 3, 
    "name" : "Daffy Duck" 
} 

每当我的网络请求的API调用,则此JSON是因为这个OHHTTPStub的返回它在测试类中声明为在所有测试之前运行。

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { 
      BOOL stringFound; 

      if ([[request.URL description] rangeOfString:[NSString stringWithFormat:@"%@devices/register?", BASEURL]].location != NSNotFound) 
      { 
       stringFound = YES; 
      } 
      NSLog(@"%d", stringFound); 

      return stringFound; 

     } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { 
      // Stub it with our "RegisterDevice.json" stub file 

      return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"RegisterDevice.json",bundle) 
                statusCode:200 headers:@{@"Content-Type":@"text/json"}] requestTime:1.0 responseTime:1.0]; 
     }]; 

我不知道,如果猕猴桃允许异步测试,但如果没有我也建议考虑Specta和匹配框架Expecta。它们允许超级简单的异步单元测试,当与OHHTTPStubs结合使用时,可以为单元测试API调用提供所需的全部内容。