在 Swift 中存根 HTTP 请求

Stubbing HTTP Requests in Swift

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

我想编写单元测试来覆盖我的功能,但我在存根 Alamofire 执行的 HTTP 请求时遇到了问题。我正在使用 Nocilla(导入到桥接头中)来尝试存根我的 HTTP 请求,但似乎在测试中从未达到对我的 HTTP 请求的回调。

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

谢谢!

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

  1. 我通常有一个 class "wraps"(我们称它为 Service)底层网络 APIs(Alamofire、AFNetworking,或者只是纯 iOS APIs)。 Service 通常是无状态的,负责为我的应用程序进行调用 "nicer"。
  2. 对我来说,Service 通常与我尝试使用的 REST API 密切相关。例如,如果我使用的 REST API 允许我 POST 到 Person 集合,我将有一个 API 像 Service.PostPersonService.GetPerson,等等
  3. 我的应用程序 classes(通常是控制器)使用 Service 并且通常使用 inversion of control 来创建 Service
  4. 在我的单元测试中,我提供了一个 UnitTestService 以便我的 classes 最终使用 UnitTestService 的实例而不是 Service 的实例。
  5. 为简单起见,我的 UnitTestService 通常 returns 根据配置硬编码 JSON 响应。因此,在上面的示例中,我将对 Service.PostPerson.
  6. 进行硬编码 JSON 响应

我使用了多种技术来做到这一点:

  • 有一个 ServiceProtocol ServiceUnitTestService 都实现的协议
  • 有一个用一组闭包实例化的 Service。这些闭包执行实际工作,您可以根据您是连接到 Internet 还是模拟它来提供不同的闭包。

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