При проведении модульных тестов для цели 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 раз..."