用 Swift 编写网络层单元测试

 

单元测试主要用来检测某个工作单元的结果是否符合预期,以此保证该工作单元的逻辑正确。上次写封装一个 Swift-Style 的网络模块的时候在结尾提了一下单元测试的重要性,评论中有朋友对网络层的单元测试有一些疑惑。我推荐他去看《单元测试的艺术》(这本书让我对单元测试有了新的认识),但由于该书是以 C# 为例写的,可能会对 iOS 开发的朋友造成一定的阅读障碍,所以我还是决定填一下坑,简单介绍一下用 Swift 进行网络层单元测试的方法。不过由于 Swift 的函数式特性,像《单元测试的艺术》中那样单纯地用 OOP 思维编写测试可能会有些麻烦,本文临近结尾部分写了一点自己用过的使用“伪装函数”进行测试的方法,可能大家以前没见过,我自己也是突然想到的,欢迎提出各种意见。

网络层的单元测试之所以让人感觉难以下手,原因主要有两点:

  • 网络是个不稳定的外部依赖。
  • 网络操作一般会涉及异步过程,而异步过程难以测试。

要直接测试网络和异步调用,可以使用XCTest提供的expectationWithDescription+waitForExpectationsWithTimeout,举个例子: