在Swift中存根HTTP请求

vli*_*lin 2 unit-testing ios nocilla swift alamofire

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

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

我想知道是否有人有任何成功在他们的测试套件中成功存储Alamofire的HTTP请求的经验?

谢谢!

tng*_*tng 7

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

  1. 我通常有一个"包装"(让我们称之为Service)底层网络API(Alamofire,AFNetworking,或仅仅是纯iOS API)的类.Service通常是无状态的,负责为我的应用程序调用"更好".
  2. 对我来说,Service通常与我尝试使用的REST API密切相关.例如,如果我使用的是REST API,让我张贴到一个Person集合,我将有一个API一样Service.PostPerson,Service.GetPerson等等.
  3. 我的应用程序类(通常是控制器)使用Service并通常用于inversion of control创建Service.
  4. 在我的单元测试中,我提供了一个,UnitTestService以便我的类最终使用实例UnitTestService而不是实例Service.
  5. 为简单起见,我UnitTestService通常会根据配置返回硬编码的JSON响应.所以在上面的例子中,我会有一个硬编码的JSON响应Service.PostPerson.

我已经使用了许多技术来做到这一点:

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

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