在Swift中存根HTTP请求

时间:2015-02-26 17:16:11

标签: ios unit-testing swift alamofire nocilla

我正在使用Swift作为iOS应用程序,并使用Alamofire执行HTTP请求。

我想编写单元测试来覆盖我的功能,但是我无法将Alamofire执行的HTTP请求存根。我正在使用Nocilla(导入到桥接头)来尝试存根我的HTTP请求但似乎在测试中永远不会到达我的HTTP请求的回调。

我想知道是否有人在测试套件中成功存储了Alamofire的HTTP请求?

谢谢!

1 个答案:

答案 0 :(得分:6)

我没有,但这是我用于单元测试HTTP请求(特别是调用REST API)的一般模式。我已经成功地将它用于Alamofire和AFNetworking。

  1. 我通常有一个“包装”(让我们称之为Service)基础网络API(Alamofire,AFNetworking或纯iOS API)的类。 Service通常是无状态的,负责为我的应用程序调用“更好”。
  2. 对我来说,Service通常与我尝试使用的REST API密切相关。例如,如果我使用允许我发送到Person集合的REST API,我会使用Service.PostPersonService.GetPerson等API。
  3. 我的应用程序类(通常是控制器)使用Service并且通常使用inversion of control来创建Service
  4. 在我的单元测试中,我提供了UnitTestService,以便我的课程最终使用UnitTestService的实例而不是Service的实例。
  5. 为简单起见,我的UnitTestService通常会根据配置返回硬编码的JSON响应。因此,在上面的示例中,我将对Service.PostPerson进行硬编码的JSON响应。
  6. 我使用了很多技巧来做到这一点:

    • 拥有ServiceProtocolService实施
    • 的协议UnitTestService
    • 使用一组闭包实例化一个Service。这些闭包可以完成实际工作,您可以提供不同的闭包,具体取决于您是连接到Internet还是模拟它。

    因为我有一些函数式编程背景,所以我喜欢后者。但这两种技术都有效。