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