Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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 выглядели точно так же, как любая другая ошибка соединения.