gpt4 book ai didi

iphone - 测试 NSURLConnection 与 HTTP 响应错误状态的使用

转载 作者:太空狗 更新时间:2023-10-30 03:12:15 25 4
gpt4 key购买 nike

我正在编写一个需要从 Web 服务器获取一些数据的 iPhone 应用程序。我正在使用 NSURLConnection 执行 HTTP 请求,效果很好,但在响应具有 HTTP 错误代码(如 404 或 500)的情况下,我无法对我的代码进行单元测试。

我正在使用 GTM用于单元测试和 OCMock用于 mock 。

当服务器返回错误时,连接不会调用委托(delegate)上的connection:didFailWithError:,而是调用connection:didReceiveResponse:, connection:didReceiveData :connectionDidFinishLoading: 代替。我目前正在检查 connection:didReceiveResponse: 中响应的状态代码,并在状态代码看起来像错误时调用连接上的 cancel 以防止 connectionDidFinishLoading : 从被调用开始,将报告成功的响应。

提供静态 stub NSURLConnection 很简单,但我希望我的测试在调用模拟连接的方法之一时更改它的行为。具体来说,我希望测试能够判断代码何时在模拟连接上调用了 cancel,这样测试就可以停止调用 connection:didReceiveData: connectionDidFinishLoading: 在委托(delegate)上。

有没有办法让测试判断 cancel 是否已在模拟对象上调用?是否有更好的方法来测试使用 NSURLConnection 的代码?有没有更好的方法来处理 HTTP 错误状态?

最佳答案

Is there a better way to handle HTTP error statuses?

我认为您走在正确的轨道上。我使用类似于以下代码的代码,我发现了 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 错误代码的行为与任何其他连接错误完全相同。

关于iphone - 测试 NSURLConnection 与 HTTP 响应错误状态的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/697108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com