测试 NSURLConnection 与 HTTP 响应错误状态的使用
Posted
技术标签:
【中文标题】测试 NSURLConnection 与 HTTP 响应错误状态的使用【英文标题】:Testing use of NSURLConnection with HTTP response error statuses 【发布时间】:2009-03-30 13:04:58 【问题描述】:我正在编写一个需要从 Web 服务器获取一些数据的 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 错误状态?
【问题讨论】:
您介意展示一些示例代码,说明您如何对 NSURLConnection 的调用进行单元测试吗? 【参考方案1】:有没有更好的方法来处理 HTTP 错误状态?
我认为你是在正确的轨道上。我使用类似于以下代码的东西,我发现了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];
这会取消连接,并调用connection:didFailWithError:
以使http 错误代码的行为与任何其他连接错误完全相同。
【讨论】:
效果很好。小问题:NSHTTPPropertyStatusCodeKey
已弃用。
你可以使用任何字符串,例如@"Error",而不是NSHTTPPropertyStatusCodeKey
是的,这看起来不像是正确使用 NSHTTPPropertyStatusCodeKey
。参照。 NSURL 类参考:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…。另外,如果您是 Xcode 4.4 或更高版本,您可以将字典代码缩短为 @NSLocalizedDescriptionKey : [NSHTTPURLResponse localizedStringForStatusCode:statusCode]
。
@Clay Bridges:它早在 2009 年就可以使用,但从那时起我就没有及时了解任何变化。我认为现在有更好的方法。有什么想法吗?
@Clay Bridges:我感受到了:)
的爱,谢谢。所以domain:
参数实际上只是一个字符串常量,以便错误处理程序可以了解发生了什么问题。它不必是NSHTTPPropertyStatusCodeKey
才能工作,事实上,它不应该是,因为该密钥已被弃用。我说的对吗?以上是关于测试 NSURLConnection 与 HTTP 响应错误状态的使用的主要内容,如果未能解决你的问题,请参考以下文章
iphone OCMockObject 和单元测试从 NSURLConnection 继承的类
iOS 中的 NSURLConnection 和基本 HTTP 身份验证
NSURLConnection/CFURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9813) iOS
iOS 9 上的 NSURLConnection 不使用 HTTP/2 协议
NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)[重复]