Тестирование использования NSURLConnection со статусами ошибок ответа HTTP

Я пишу приложение для iPhone, которое должно получить данные с веб-сервера. я использую NSURLConnection сделать HTTP-запрос, который работает хорошо, но у меня возникают проблемы с модульным тестированием моего кода в случае, когда ответ имеет код ошибки HTTP (например, 404 или 500).

Я использую GTM для юнит-тестирования и OCMock для насмешек.

Когда сервер возвращает ошибку, соединение не вызывает connection:didFailWithError: на делегата, но звонит connection:didReceiveResponse:, connection:didReceiveData:, а также connectionDidFinishLoading: вместо. В настоящее время я проверяю код состояния в ответе connection:didReceiveResponse: и звонит cancel на соединение, когда код состояния выглядит как ошибка, чтобы предотвратить connectionDidFinishLoading: от вызова, где будет сообщено об успешном ответе.

Предоставление статической заглушки NSURLConnection прост, но я хочу, чтобы мой тест изменил свое поведение при вызове одного из методов фиктивного соединения. В частности, я хочу, чтобы тест мог сказать, когда код вызвал cancel на фиктивном соединении, поэтому тест может прекратить звонить connection:didReceiveData: а также connectionDidFinishLoading: на делегата.

Есть ли способ для тестов сказать, если cancel был вызван на макет объекта? Есть ли лучший способ проверить код, который использует NSURLConnection? Есть ли лучший способ обработки статусов ошибок HTTP?

1 ответ

Есть ли лучший способ обработки статусов ошибок HTTP?

Я думаю, что вы на правильном пути. Я использую что-то похожее на следующий код, который я нашел здесь:

if ([response respondsToSelector:@selector(statusCode)])
{
    int statusCode = [((NSHTTPURLResponse *)response) statusCode];
    if (statusCode >= 400)
    {
        [connection cancel];  // stop connecting; no more delegate messages
        NSDictionary *errorInfo
          = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:
            NSLocalizedString(@"Server returned status code %d",@""),
            statusCode]
                                        forKey:NSLocalizedDescriptionKey];
        NSError *statusError
          = [NSError errorWithDomain:NSHTTPPropertyStatusCodeKey
                                code:statusCode
                            userInfo:errorInfo];
        [self connection:connection didFailWithError:statusError];
    }
}

Это отменяет соединение и звонки connection:didFailWithError: чтобы коды ошибок http вели себя так же, как и любые другие ошибки подключения.

Другие вопросы по тегам