测试 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 继承的类

网络服务器 NSURL NSURLConnection

iOS 中的 NSURLConnection 和基本 HTTP 身份验证

NSURLConnection/CFURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9813) iOS

iOS 9 上的 NSURLConnection 不使用 HTTP/2 协议

NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)[重复]