如何使用 Alamofire 为 http 请求编写单元测试?

Posted

技术标签:

【中文标题】如何使用 Alamofire 为 http 请求编写单元测试?【英文标题】:How to write unit test for http request with Alamofire? 【发布时间】:2017-07-14 00:15:54 【问题描述】:

我的应用正在使用 Alamofire 发送 http 请求,并想为此部分编写一些单元测试。我创建了一些 json 文件作为响应。如何阻止 Alamofire 请求并让 Alamofire 返回 json 文件中的内容作为响应?可以用method swizzling来替换函数吗?

【问题讨论】:

【参考方案1】:

使用 OHHTTPStubs 之类的框架来存根您的网络请求或发出真实的网络请求。无论哪种情况,XCTest 都有多种异步等待方法,例如XCTExpectations。

【讨论】:

【参考方案2】:

这就是您等待一些异步回调的方式。这是最低限度的测试。您可以根据您的测试要求对其进行更多改进

func testCheckThatTheNetworkResponseIsEqualToTheExpectedResult() 

    //expected result 
    let expectedResult: [String:Any] = ["data":"somedata","order_number":2]

    let expectations = expectation(description: "The Response result match the expected results")

    if let requestUrl = URL(string: "some url to fetch data from") 

        let request = Alamofire.request(requestUrl, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil)
        request.responseJSON(completionHandler:  (response) in
            switch response.result 
            case .success(let result):
                //do the checking with expected result
                //AssertEqual or whatever you need to do with the data
                //finally fullfill the expectation
                expectations.fulfill()
            case .failure(let error):
                //this is failed case
                XCTFail("Server response failed : \(error.localizedDescription)")
                expectations.fulfill()
            
        )

        //wait for some time for the expectation (you can wait here more than 30 sec, depending on the time for the response)
        waitForExpectations(timeout: 30, handler:  (error) in
            if let error = error 
                print("Failed : \(error.localizedDescription)")
            

        )
    


【讨论】:

这会在 waitForExpectations 出现“无法及时为应用程序更新应用程序状态”的错误。

以上是关于如何使用 Alamofire 为 http 请求编写单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Alamofire 请求添加参数

如何使用 alamofire 在 HTTP 请求中发送 json

如何从方法返回 alamofire Http 请求的结果?

如何使用 Alamofire 发送带有压缩内容的 HTTP POST 请求?

如何使用 Alamofire 读取错误请求的 json 数据(状态码 400)

如何使用 Alamofire 为每个请求添加 auth 标头,如果响应为 401 则执行某些操作?