【问题标题】:XCode Unit Tests and NSURLConnectionDelegate callbacks?XCode 单元测试和 NSURLConnectionDelegate 回调?
【发布时间】:2014-02-26 23:12:58
【问题描述】:

我在 Xcode 5 中为我的项目设置单元测试。在单元测试中,我触发了一些事件,这些事件将构建并向服务器发送 HTTP 请求。即使我看到请求正在发送并接收响应(通过 Charles Web 代理),但似乎没有来自 NSURLConnectionDelegate 或 NSURLConnectionDataDelegate 的任何代码正在执行,例如

– connection:didReceiveResponse:
– connection:didReceiveData:

我知道已经有很多关于单元测试异步代码的问题,但我担心为什么我的 HTTP 请求被发送并接收响应,但我的委托在单元测试期间不执行回调。我已经确保在异步操作有时间完成之前测试没有完成执行。

谢谢。

【问题讨论】:

  • 一个可能的原因是您的委托被安排在与 主线程(这是默认设置)关联的运行循环上,并且您的测试方法也将在主线程 - 一个经典的死锁。您可以通过显式调用运行循环来解决此问题,但需要考虑一些细微之处。
  • 很酷,有道理,谢谢。把这个作为答案,我会选择它。
  • “承诺”是什么意思?
  • ohps - 评论错误... :) 我指的是这个问题:stackoverflow.com/questions/22055279/… 您当然可以检查我评论中的链接是否也对您有帮助;)

标签: objective-c xcode unit-testing


【解决方案1】:

用一些辅助方法包装您的网络代码并模拟它。您不想在单元测试中访问网络,因为:

a) 它会减慢您的单元测试速度

b) 它会引入不稳定(例如:网络或服务器出现故障)

一般来说,您希望您的单元测试是可重复的,而将网络引入等式只会让您头疼。获取一些好的内容和一些不好的内容(例如:404 错误,或您的应用可能遇到的其他情况)的示例。将这些数据文件放入您的单元测试项目中,然后让您伪造的网络代码返回数据文件,而不是发出网络请求。

【讨论】:

  • 谢谢尼古拉斯。我更多地出于技术好奇心而问这个问题,我已经阅读了很多关于你不应该这样做的内容。只是想知道为什么这些委托回调在从单元测试运行时不执行,即使请求在测试运行时通过。
猜你喜欢
  • 2011-07-31
  • 2017-05-09
  • 2015-04-18
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多