При проведении модульных тестов для цели C, как вы тестируете блоки?
У меня есть функция (внутренне использует ASIHTTPRequest), которая вызывает блок с результатом:
[Http get:@"http://api.geonames.org/postalCodeLookupJSON"
params:params cacheMins:0 complete:^(NSDictionary *response, BOOL success) {
STAssertTrue(success, @"JSON retrieved OK");
STFail(@"blah");
}];
Я хочу протестировать выше, но, похоже, тест не вызван.
Как я могу убедиться, что тест ждет, пока не будет вызван блок?
-edit -
Конечно, я не рекомендую делать это в главном приложении в потоке gui, в этой конкретной ситуации он предназначен только для unit test.
Ответы
Ответ 1
Найдено решение:
Подождите, пока код завершит выполнение
Например:
__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;
}];
// /questions/471408/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);
}
Ответ 2
Не знаю, где я нашел это, но там лучший способ, который не использует сон:
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){};
Спит сосать, потому что они замедляют сборку (я знаю, что 5-е не звучат плохо, но рассмотрим старую историю: парень идет к врачу, потому что его колени болят от бега, Доктор говорит: "вставай на стол" и ударив его колено и говорит: "Это больно?" парень говорит "нет", доктор: "если бы я сделал это 10K раз..."