Когда вы проводите юнит-тесты для цели C, как вы тестируете блоки? - PullRequest
11 голосов
/ 13 апреля 2011

У меня есть функция (внутренне использует 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-

Конечно, я не рекомендую делать это в основном приложении в потоке графического интерфейса., в этой конкретной ситуации это только для модульного теста.

Ответы [ 2 ]

7 голосов
/ 13 апреля 2011

Нашли решение:

Дождаться завершения выполнения кода

Например:

__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;
}];

// /2584938/podozhdite-poka-kod-zavershit-vypolnenie
while (!done) {
    // This executes another run loop.
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    // Sleep 1/100th sec
    usleep(10000);
}
3 голосов
/ 12 марта 2013

Не уверен, где я нашел это, но есть лучший способ не использовать сны:

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 раз ...»

...