Как я могу заставить тестовый метод ждать, пока делегат закончит обработку? - PullRequest
0 голосов
/ 20 января 2012

У меня есть следующий код теста Objective C в классе SenTestCase. Я не получаю ошибок, но метод httpReceiveDataFinished никогда не вызывается. Это потому, что тест завершен до того, как делегат сможет обработать метод http?

Если это так, как я могу раскрутить нить (или что-то подобное), чтобы заставить тест ждать несколько секунд?

Спасибо миллион за любую помощь. Я программировал Java годами, но Objective-C всего несколько дней.

- (void)testExample
{
    HttpClient *client = [[HttpClient alloc] init];
    client.method = METHOD_GET;
    client.followRedirects = YES;
    [client processRequest:@"http://google.com" delegate:self];
    NSLog(@"Test Over");
}

-(void) httpReceiveError:(NSError*)error {
    NSLog(@"***\n%@\n***",[error description]);
}

- (void) httpReceiveDataChunk:(NSData *)data {
    [self.httpResponseData appendData:data];
}

-(void) httpReceiveDataFinished {
    NSString *result = [[NSString alloc] 
        initWithData:self.httpResponseData 
        encoding:NSUTF8StringEncoding];
    NSLog(@"***\nRESULT: %@ \n***",result);
}

1 Ответ

0 голосов
/ 20 января 2012

Первое: ссылка Станислава отличная. Для себя мне нужно было что-то более гибкое (работать в течение длительного времени), но также сразу же успешно проходить тест. (Загрузка больших файлов и тому подобное.)

Вот моя полезная функция:

-(BOOL)runLooperDooper:(NSTimeInterval)timeoutInSeconds 
      optionalTestName:(NSString *)testName 
{
    NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds];
    // loop until the operation completes and sets stopRunLoop = TRUE
    // or until the timeout has expired

    while (!stopRunLoop && [giveUpDate timeIntervalSinceNow] > 0) 
    {
        // run the current run loop for 1.0 second(s) to give the operation code a chance to work
        NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
        [[NSRunLoop currentRunLoop] runUntilDate:stopDate];
    }

    STAssertTrue(stopRunLoop, 
                 @"%@ failed to finish before runloop expired after %f seconds", testName, timeoutInSeconds);
    return stopRunLoop;
}

Объявите stopRunLoop в качестве ивара в вашем классе тестеров. Обязательно сбросьте stopRunLoop в FALSE в вашей функции setUp и вызовите эту функцию до вызова вашего [client processRequest:@"http://google.com" delegate:self]; Затем в ваших обработчиках событий установите для stopRunLoop значение TRUE.

Передав ему testName, вы можете использовать его для нескольких тестов и получить несколько значимых сообщений об ошибках.

Редактировать: 99% уверены, что я основал приведенный выше код на другом посте StackOverflow, который я не могу найти в данный момент, или я бы связал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...