Может ли OCUnit полагаться на код в фоновых потоках? (для проверки асинхронных запросов) - PullRequest
1 голос
/ 29 ноября 2010

Я пытался автоматизировать тестирование асинхронных запросов, но я не смог запустить что-либо в другом потоке, пока ожидала функция тестирования. Вот тестовая функция:

- (void) testBoxManagerConnexionStatus
{
    ControlSender* cs = [ControlSender get];
    requestShouldSucceed = YES;
    [cs startCheckingReachabilityWithDelegate:self];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:TIMEOUT_INTERVAL+1.0]];

    STAssertTrue(downloadComplete, @"Download should be over by now");
}

Мой тестовый класс реализует методы обратного вызова следующим образом:

- (void)controlSender:(ControlSender *)controlSender sentSuccessfullyCode:(FreeboxControl)code
{
    if (requestShouldFail) {
        STAssertTrue(NO, @"Request should have failed");
    }
    downloadComplete = YES;

}
- (void)controlSender:(ControlSender *)controlSender couldntSendCode:(FreeboxControl)code details:(NSHTTPURLResponse*)details
{
    if (requestShouldSucceed) {
        STAssertTrue(NO, @"Request should have succeded");
    }
    downloadComplete = YES;
}

Но всякий раз, когда мой обычный код пытается запустить что-то в другом потоке, ничего не происходит. Например, NSURLConnection никогда не вызывает свои методы делегата при выделении:

m_connexion = [[NSURLConnection alloc] initWithRequest:m_networkRequest delegate:self];

Ни -connectionDidFinishLoading:, ни -connection:didFailWithError:

То же самое для звонков, подобных этому:

[self performSelectorInBackground:@selector(BG_startCheckingReachabilityWithDelegate:) withObject:delegate];

При запуске теста Nothings вызывается в фоновом режиме. Этот же код отлично работает вне теста. Есть ли способ проверить асинхронный URL-запрос с помощью OCUnit?

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

вы можете посмотреть на https://github.com/danielpunkass/RSTestingKit, в котором есть способ ожидания цикла выполнения в модульных тестах, вы можете увидеть его слайды на http://www.red -sweater.com /alks / UnitTesting.pdf для некоторого фона. В нем может быть некоторая информация, которая поможет вам начать работу.

1 голос
/ 30 ноября 2010

Вы можете попробовать запускать подобные запросы в фоновом потоке, но не хотите. Для вашего здравого смысла вы не хотите, чтобы ваши тесты зависели от внешних сервисов. Что делать, если удаленный сервис не работает? Ваш тест не пройден. Что делать, если удаленный сервис возвращает ошибку? Ваш тест не проходит? Что если вы хотите узнать, что делает ваш код, когда удаленная служба отвечает ошибкой на действительный запрос? Вы не можете (последовательно). Даже если ваши тесты пройдут успешно, они будут работать медленно, в зависимости от того, сколько времени потребуется для ответа удаленной службы.

Ваша жизнь станет проще, если вы исключите зависимость от каких-либо удаленных сервисов для целей своих тестов. См. этот ответ (и связанный с ним вопрос) для более подробных рассуждений.

...