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