【问题标题】:Testing use of NSURLConnection with HTTP response error statuses测试 NSURLConnection 与 HTTP 响应错误状态的使用
【发布时间】: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 的调用进行单元测试吗?

标签: iphone objective-c cocoa-touch ocmock


【解决方案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 才能工作,事实上,它不应该是,因为该密钥已被弃用。我说的对吗?
猜你喜欢
  • 2020-08-02
  • 2021-10-21
  • 2018-05-27
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2017-03-13
  • 2014-03-22
  • 2014-12-16
相关资源
最近更新 更多