【问题标题】:Swift 5.5 Await Async Mocking and Unit Tests - AlamofireSwift 5.5 等待异步模拟和单元测试 - Alamofire
【发布时间】:2022-02-16 10:45:13
【问题描述】:

假设我有这样的东西

import Alamofire

class NetworkStuff {
    
    func getSomething() async throws -> String {
        let params: [String: String] = ["Key": "Value"]
    
        let value = AF.request("https://myapi.com/endpoint", method: .post, parameters:  params, encoder: JSONParameterEncoder.default)
            .validate()
            .responseDecodable([String: String].self).value("KeyIWant")
        guard let result = value else {throw MyError.SomeError }
        return result
    }
}

我将如何编写一个单元测试来验证这个请求是正确的并且我正在解码响应。 假设我们将其发送到服务器:

{
"RequestItem": "Value"
}

假设来自服务器的响应如下所示:

{
  "ID": "1234",
  "KeyIWant": "Value02"
}

我如何编写测试以确保我的 POST 参数按照服务器的预期正确构建,然后模拟响应以确保我正确解析它以获得我想要的值?

【问题讨论】:

    标签: swift unit-testing async-await


    【解决方案1】:

    请记住,您不想在端点测试网络或 AlamoFire 或服务器。您只想测试您的代码。

    为此,您需要使代码可测试。将getSomething 分解为可测试的子例程——这类事情:

    func getSomething() async throws -> String {
        let params = self.constructParams()
        let value = AF.request("https://myapi.com/endpoint", method: .post, parameters:  params, encoder: JSONParameterEncoder.default)
        let result = self.processValue(value)
        return result
    }
    

    现在constructParamsprocessValue 是您可以通过正常方式测试的方法,提供各种输入并检查您是否获得了预期的输出。

    【讨论】:

      【解决方案2】:

      我将把答案分成两部分(我假设您熟悉 XCTest 框架或其开源包装器 Quick 和 Nimble,这些是我推荐用于测试的):

      首先,编写一个测试以确保 POST 参数的结构正确 - 我将重构函数并将它们作为参数传递给它。然后我会编写一个负责构建参数的类并为它编写一个测试套件 - 确保它正确构建参数,类似于

      final class ParamBuilder {
        func params() -> [String: Any] { ["Key": "Value"] }
      }
      
      // Testing
      class ParamBuildierTests: XCTestCase {
      
        func testFirst() {
            let builder = ParamBuilder()
             XCTAssertEqual(builder.params(), ["Key": "Value"])
        }
      }
      

      第二,模拟和测试响应。 我个人推荐使用Mockingjay,它的用法非常简单,它可以模拟响应,这样你就可以继续使用使用Alamofire(底层URLSession)的相同服务NetworkStuff 。它将根据您的偏好存根响应 - 您可以模拟 404 响应和不同的有效负载

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-20
        • 2018-05-12
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 2021-10-13
        • 2017-06-01
        • 1970-01-01
        相关资源
        最近更新 更多