2010-11-29 2 views
1

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

- (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

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

+0

Это действительно интересный материал. Спасибо, я попробую и дам вам знать, работает ли это. – mbritto 2010-12-01 08:52:20

1

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

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

+0

Спасибо Адаму, я уже читал ваше предыдущее сообщение при поиске решений. Причина, по которой я все еще пытаюсь протестировать эти асинхронные вызовы, заключается в том, что они не с удаленной службой, а с приставкой локальной сети (Wi-Fi). – mbritto 2010-12-01 08:36:23

 Смежные вопросы

  • Нет связанных вопросов^_^