2009-03-30 3 views
22

웹 서버에서 데이터를 가져와야하는 iPhone 응용 프로그램을 작성하고 있습니다. 나는 잘 작동하는 HTTP 요청을 수행하기 위해 NSURLConnection을 사용하고 있지만 응답에 HTTP 오류 코드 (예 : 404 또는 500)가있는 경우 내 코드를 테스트하는 데 문제가 있습니다.HTTP 응답 오류 상태를 사용하여 NSURLConnection을 테스트합니다.

단위 테스트에는 GTM을, 조롱에는 OCMock을 사용하고 있습니다. 서버가 오류를 반환 할 때

연결이 대리자에 connection:didFailWithError:를 호출하지 않습니다, 대신, connection:didReceiveResponse:connection:didReceiveData:connectionDidFinishLoading:를 호출합니다. 현재 connection:didReceiveResponse: 응답의 상태 코드를 확인하고 이 호출되지 않도록 상태 코드가 오류처럼 보이는 경우 연결시 cancel을 호출하면 성공적인 응답이보고됩니다.

static stubbed를 제공하는 것은 간단하지만 mock 연결 메소드 중 하나가 호출 될 때 동작이 변경되도록하고 싶습니다. 특히 테스트에서 코드가 cancel이라는 모의 연결에서 호출 된 것을 테스트에서 알려 주면 테스트에서 connection:didReceiveData:connectionDidFinishLoading:을 대리인에 대한 호출을 중지 할 수 있습니다.

모의 객체에서 cancel이 호출되었는지 확인할 수있는 방법이 있습니까? NSURLConnection을 사용하는 코드를 테스트하는 더 좋은 방법이 있습니까? HTTP 오류 상태를 처리하는 더 좋은 방법이 있습니까?

+0

NSURLConnection에 대한 호출을 단위 테스트하는 방법에 대한 샘플 코드를 보여 주시겠습니까? –

답변

43

Is there a better way to handle HTTP error statuses?

나는 당신이 올바른 길에 있다고 생각합니다.

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]; 
    } 
} 

이 연결을 취소하고, HTTP 오류 코드가 정확히 어떤 다른 연결 오류와 같은 행동을 만들기 위해 connection:didFailWithError: 전화 : 내가 here을 발견 다음 코드와 비슷한 사용합니다.

+1

잘 작동합니다. 약간의 문제 :'NSHTTPPropertyStatusCodeKey'는 더 이상 사용되지 않습니다. –

+3

NSHTTPPropertyStatusCodeKey 대신 @ "Error"와 같은 임의의 문자열을 사용할 수 있습니다. –

+0

예, 이것은 NSHTTPPropertyStatusCodeKey를 올바르게 사용하는 것처럼 보이지 않습니다. Cf. NSURL 클래스 참조 : http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html%23//apple_ref/occ/instm/NSURL/relativePath . 또한 Xcode 4.4 이상인 경우 사전 코드를'@ {NSLocalizedDescriptionKey : [NSHTTPURLResponse localizedStringForStatusCode : statusCode]}'로 줄일 수 있습니다. –