2013-02-10 62 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調用提供所需的全部內容。