【问题标题】:Create a Swift HTTP mock with alternate data使用备用数据创建 Swift HTTP 模拟
【发布时间】:2019-08-26 04:44:37
【问题描述】:

我有一个模拟的 HTTPManager,我希望它返回一个 userIDResonse 或一个 tokenResponse。

为了能够做到这一点,我使模拟符合协议以允许在测试中进行设置。

let userIDResponse = """
{\"user_id\":\"5a7ab957a225856b38f49bb4\"}
"""

let tokenResponse = """
{\"access_token\":\"eyJhbGciOiJSUzI1NiIsImtpZCI6IjczMUE3OUEyMjY3QjY4Q0EwNTc5QjYzRjdFMkY0QjlBQkZFMENEMTUiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJjeHA1b2laN2FNb0ZlYllfZmk5TG1yX2d6UlUifQ.eyJuYmYiOjE1MTI5NjU3NTgsImV4cCI6MTUxMjk2OTM1OCwiaXNzIjoiaHR0cHM6Ly9pZG0uYWxwaGFub3ZhLnNnIiwiYXVkIjpbImh0dHBzOi8vaWRtLmFscGhhbm92YS5zZy9yZXNvdXJjZXMiLCJhcGkyIl0sImNsaWVudF9pZCI6ImNhcGFwb3QtbmciLCJzdWIiOiI1YTFjMWU5MjY0MjUzYjFlMWU2N2ZhZDIiLCJhdXRoX3RpbWUiOjE1MTI5NjU3NTgsImlkcCI6ImFscGhhbm92YSIsImZpcnN0X25hbWUiOiJTdGV2ZW4iLCJsYXN0X25hbWUiOiJDdXJ0aXMiLCJuYW1lIjoiU3RldmVuIEN1cnRpcyIsImVtYWlsIjoic3RldmVuQGFscGhhbm92YS5zZyIsInNjb3BlIjpbImNhcGFwb3QucHJvZmlsZSIsImVtYWlsIiwib3BlbmlkIiwiYXBpMi5yZWFkX29ubHkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsicGFzc3dvcmQiXX0.q4-SF5KBVSwN4bFhcQ88icR9X2jzz_JH2K4EpDgS-oZjjppNruckxfTjauVqcwG8zPR0eGzx5CBXiAfMeg9akShWajqBZ9rkCsqjXw6Ef74J9cTBDhxTEUL0v7P0zm_fVNOutM_UJQ-DiQr2gAO0mfAxMhOiQ_uXlKoM2RYGKjfMkH6Ym7kBjtRAhho8pPVmtQiBmVFI5OUVXNU3rPVgB7sx-I1LZmUZBZoy7T4s14TAuE4yiUyTBgO5joyRsZtMdFybna8CRK_ylS3WC6wOBNm74O9IrZlbsiradtLzMG-9E8AnjbvH4RYR68H2xpt562PfnGD_VC9NXFQ7iRrRMw\"}
"""

被Mock使用

protocol HTTPManagerMockProtocol {
    func setResponse(response: String.UTF8View)
}

typealias HTTPMock = HTTPManagerProtocol & HTTPManagerMockProtocol

class HTTPManagerMock: HTTPMock {

    var data = Data(userIDResponse.utf8)

    func setResponse(response: String.UTF8View) {
        data = Data(response)
    }

    func get(urlString: String, parameters: [String : String], completionBlock: @escaping (Result<Data, Error>) -> Void) {
        completionBlock(.success(data))
    }

}

那么在我的测试中我必须设置响应:

let httpMock = HTTPManagerMock()
httpMock.setResponse(response: tokenResponse.utf8)
sut = Login(serverString: "serverURL", headers: [:], httpManager: httpMock )

在某些方面这似乎没问题,但这意味着我不能在我的测试中使用 setup 函数,这会导致我的测试类中出现重复代码。

哪种方法意味着我可以在不生成额外测试代码的情况下进行具有不同输出的模拟?

【问题讨论】:

    标签: swift xctest


    【解决方案1】:

    制作一个参数化的辅助方法来创建您的被测系统。

    private func makeLogin(response: String) -> Login {
        let httpMock = HTTPManagerMock()
        httpMock.setResponse(response: response.utf8)
        return Login(serverString: "serverURL", headers: [:], httpManager: httpMock)
    }
    

    这样,您可以在不同的测试中改变响应。如果您的测试并不真正关心响应并希望提供虚拟数据,那么这可以是帮助程序中的默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2021-12-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多