gpt4 book ai didi

ios - 如何模拟 URL 结构?

转载 作者:行者123 更新时间:2023-11-29 05:54:19 25 4
gpt4 key购买 nike

我正在编写一些代码以使测试更容易。经过研究,我发现使 URLSession 可测试的一个好方法是使其符合协议(protocol)并在我需要测试的类中使用该协议(protocol)。我对 URL 应用了相同的方法。但是,我现在需要将 url 参数向下转换为 URL 类型。这对我来说似乎有点“危险”。使 URL 可测试的正确方法是什么?我怎样才能模拟 dataTask 返回的 URLSessionDataTask 类型?

import Foundation

protocol URLSessionForApiRequest {
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
}

protocol URLForApiRequest {
init?(string: String)
}

extension URLSession: URLSessionForApiRequest {}

extension URL: URLForApiRequest {}

class ApiRequest {
class func makeRequest(url: URLForApiRequest, urlSession: URLSessionForApiRequest) {
guard let url = url as? URL else { return }
let task = urlSession.dataTask(with: url) { _, _, _ in print("DONE") }
task.resume()
}

}

最佳答案

您想要创建一个协议(protocol)来包装您要调用的函数,然后创建一个具体的实现和模拟实现,以返回您初始化它的任何内容。这是一个例子:

import UIKit
import PlaygroundSupport

protocol RequestProvider {
func request(from: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void)
}

class ApiRequest: RequestProvider {
func request(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
URLSession.shared.dataTask(with: url, completionHandler: completion).resume
}
}

class MockApiRequest: RequestProvider {
enum Response {
case value(Data, URLResponse), error(Error)
}
private let response: Response
init(response: Response) {
self.response = response
}
func request(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
switch response {
case .value(let data, let response):
completion(data, response, nil)
case .error(let error):
completion(nil, nil, error)
}
}
}

class SomeClassThatMakesAnAPIRequest {
private let requestProvider: RequestProvider
init(requestProvider: RequestProvider) {
self.requestProvider = requestProvider
}
//Use the requestProvider here and it uses either the Mock or the "real" API provider based don what you injected
}

关于ios - 如何模拟 URL 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com