2009-03-30 47 views
22

Tôi đang viết một ứng dụng iPhone cần lấy một số dữ liệu từ máy chủ web. Tôi đang sử dụng NSURLConnection để thực hiện yêu cầu HTTP, hoạt động tốt, nhưng tôi gặp sự cố khi kiểm tra mã của tôi trong trường hợp phản hồi có mã lỗi HTTP (như 404 hoặc 500).Thử nghiệm sử dụng NSURLConnection với trạng thái lỗi phản hồi HTTP

Tôi đang sử dụng GTM để kiểm tra đơn vị và OCMock để chế nhạo.

Khi máy chủ trả về lỗi, kết nối không gọi connection:didFailWithError: trên đại biểu, nhưng hãy gọi connection:didReceiveResponse:, connection:didReceiveData:connectionDidFinishLoading: để thay thế. Tôi hiện đang kiểm tra mã trạng thái trên phản hồi trong connection:didReceiveResponse: và gọi số cancel trên kết nối khi mã trạng thái có vẻ như lỗi để ngăn không cho connectionDidFinishLoading: được gọi, nơi phản hồi thành công sẽ được báo cáo.

Cung cấp một stubbed tĩnh NSURLConnection rất đơn giản, nhưng tôi muốn thử nghiệm của mình thay đổi hành vi của nó khi một trong các phương thức kết nối giả được gọi. Cụ thể, tôi muốn thử nghiệm có thể biết khi nào mã được gọi là cancel trên kết nối giả, vì vậy thử nghiệm có thể ngừng gọi số connection:didReceiveData:connectionDidFinishLoading: trên đại biểu.

Có cách nào để kiểm tra để biết liệu cancel có được gọi trên đối tượng giả không? Có cách nào tốt hơn để kiểm tra mã sử dụng NSURLConnection không? Có cách nào tốt hơn để xử lý trạng thái lỗi HTTP không?

+0

bạn có muốn hiển thị một số mã mẫu về cách bạn kiểm tra đơn vị các cuộc gọi đến NSURLConnection không? –

Trả lời

43

Is there a better way to handle HTTP error statuses?

Tôi nghĩ bạn đang đi đúng hướng. Tôi sử dụng một cái gì đó tương tự như đoạn mã sau, mà tôi tìm thấy here:

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

này hủy bỏ kết nối, và kêu gọi connection:didFailWithError: để làm cho mã lỗi http cư xử giống hệt như bất kỳ lỗi kết nối khác.

+1

Hoạt động tuyệt vời. Vấn đề nhẹ: 'NSHTTPPropertyStatusCodeKey' không được chấp nhận. –

+3

Bạn có thể sử dụng bất kỳ chuỗi nào, ví dụ @ "Lỗi", thay vì NSHTTPPropertyStatusCodeKey –

+0

Vâng, điều này không giống như việc sử dụng đúng 'NSHTTPPropertyStatusCodeKey'. Cf. tham chiếu lớp NSURL: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html%23//apple_ref/occ/instm/NSURL/relativePath . Ngoài ra, nếu bạn là Xcode 4.4 trở lên, bạn có thể rút ngắn mã từ điển thành '@ {NSLocalizedDescriptionKey: [NSHTTPURLResponse localizedStringForStatusCode: statusCode]}'. –

Các vấn đề liên quan