如何为Alamofire请求函数编写单元测试?

Doe*_*Doe 4 unit-testing ios swift alamofire swifty-json

我有一个项目,我发送.GET请求从服务器获取数据,为此我使用Alamofire和SwiftyJSON.

例如:

我有文件"链接","请求"和我的ViewController.

Links.swift

var getAllData: String {
    return "\(host)api/getalldata"
}
Run Code Online (Sandbox Code Playgroud)

Requests.swift

func getAllData(_ completion:@escaping (_ json: JSON?) -> Void) {
    Alamofire.request(Links.sharedInstance.getAllData).validate().responseJSON { (response) in
        do {
            let json = JSON(data: response.data!)
            completion(json)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

视图控制器

Requests.sharedInstance.getAllData { (json) in
    // ...
}
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能为这个案例编写单元测试?我刚刚学习单元测试,在所有书籍中只有本地案例,没有网络案例的例子.请允许任何人描述我并帮助如何使用Alamofire和SwiftyJSON编写网络请求的单元测试?

Wil*_*son 7

由于Requests.sharedInstance.getAllData调用是一个网络请求,你需要使用期望方法来创建它的实例,以便你可以等待它的结果Requests.sharedInstance.getAllData和超时我设置10秒,否则测试失败.

而我们期待的常量errornilresult成为nil否则测试失败了.

import XCTest

class Tests: XCTestCase {

  func testGettingJSON() {
    let ex = expectation(description: "Expecting a JSON data not nil")

    Request.sharedInstance.getAllData { (error, result) in

      XCTAssertNil(error)
      XCTAssertNotNil(result)
      ex.fulfill()

    }

    waitForExpectations(timeout: 10) { (error) in
      if let error = error {
        XCTFail("error: \(error)")
      }
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

可能您想要返回错误,以便了解您的请求失败的原因,因此您的单元测试也可以验证此信息.

func getAllData(_ completion: @escaping (_ error: NSError?, _ json: String?) -> Void) {
Run Code Online (Sandbox Code Playgroud)