2011-04-13 75 views
11

我有一個函數(內部使用ASIHTTPRequest),其中要求與結果的塊:在爲目標C進行單元測試時,如何測試塊?

[Http get:@"http://api.geonames.org/postalCodeLookupJSON" 
    params:params cacheMins:0 complete:^(NSDictionary *response, BOOL success) { 
     STAssertTrue(success, @"JSON retrieved OK"); 
     STFail(@"blah"); 
}]; 

我想測試以上,但似乎在測試不會被調用。

我如何確保測試等到塊被調用?

CNC中

當然,我不建議這樣做在GUI線程的主要應用,在這種特殊情況是隻爲一個單元測試。

回答

7

找到了解決辦法:

Wait for code to finish execution

如:

__block int done=0; 
[Http get:@"http://api.geonames.org/postalCodeLookupJSON" 
    params:params cacheMins:0 complete:^(NSDictionary *response, BOOL success) { 
     STAssertTrue(success, @"JSON retrieved OK"); 
     NSArray *postalcodes = [response objectForKey:@"postalcodes"]; 
     NSDictionary *first = [postalcodes objectAtIndex:0]; 
     NSString *adminName1 = [first objectForKey:@"adminName1"]; 
     STAssertTrue([adminName1 isEqualToString:@"New South Wales"], @"NSW"); 
     done=1; 
}]; 

// https://stackoverflow.com/questions/3615939/wait-for-code-to-finish-execution 
while (!done) { 
    // This executes another run loop. 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    // Sleep 1/100th sec 
    usleep(10000); 
} 
+0

那會睡覺(10)不停止當前線程運行該塊的線程)?如果您的主線程從睡眠中啓動該塊,則會阻止GUI。 – Damien 2011-04-13 14:59:59

+0

糟糕,我會編輯它。應該是'睡覺'。你是對的,它會停止主線程並停止gui。但是 - 這僅僅是一個單元測試。 – Chris 2011-04-13 22:16:35

3

不知道,我發現這一點,但有一個不使用休眠更好的辦法:

while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !placeMarkUpdated){}; 

這裏是在上下文中測試反向地理編碼請求:

__block BOOL placeMarkUpdated = NO; 

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { 
    if (placeMarkUpdated == NO) { 
     placeMarkUpdated = YES; 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     address = [Address addressFromPlacemark:placemark]; 
    } 
}]; 

while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !placeMarkUpdated){}; 

睡吸的原因,他們放慢版本(我知道5S聽起來並不壞,但考慮到老故事:傢伙去醫生導致他的膝蓋從運行疼,醫生說「起牀上表'並且輕拍他的膝蓋並且說'這是否傷害了?'人說'不',醫生:'如果我做它10K次...'