gpt4 book ai didi

swift - 模拟 URLSession 以返回模拟的 URLSessionDataTask

转载 作者:行者123 更新时间:2023-12-02 19:36:27 26 4
gpt4 key购买 nike

我想模拟 URLSession,并返回一个模拟的 URLSessionDataTask

为了模拟 URLSession 我创建了一个协议(protocol)

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

然后 URLSession 可以符合扩展

extension URLSession: URLSessionProtocol {}

现在我想对 URLSessionDataTask 做同样的事情,因此为它实现一个类似的协议(protocol)和扩展。我需要这样做,因为我调用 URLSession 的方式需要使用 func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void ) -> URLSessionDataTask

protocol URLSessionDataTaskProtocol {
func resume()
}

extension URLSessionDataTask: URLSessionDataTaskProtocol {}

那么我的 URLSessionDataTask mock 设置如下:

class URLSessionMock: URLSessionProtocol {
typealias CompletionHandler = (Data?, URLResponse?, Error?) -> Void
// data and error can be set to provide data or an error
var data: Data?
var error: Error?
func dataTask(
with url: URL,
completionHandler: @escaping CompletionHandler
) -> URLSessionDataTask {
let data = self.data
let error = self.error
return URLSessionDataTaskMock {
completionHandler(data, nil, error)
}
}
}

我的 URLSessionDataTaskMock 呈现:

class URLSessionDataTaskMock: URLSessionDataTaskProtocol {
private let closure: () -> Void
init(closure: @escaping () -> Void) {
self.closure = closure
}
// override resume and call the closure

func resume() {
closure()
}
}

不起作用,因为 URLSessionProtocol 中的 URLSessionDataTaskMock 不是正确的返回类型 - 我需要返回一个 URLSessionDataTask

我无法将我的 URLSessionDataTaskMock 转换为 URLSessionDataTask,因为类型不相关。

如何从我的 URLSessionProtocol 返回我的 URLSessionDataTaskMock

最佳答案

你或许可以逃脱这样的事情。关键是您的 URLSession 协议(protocol)中的关联类型

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

extension URLSession: URLSessionProtocol {}

protocol URLSessionDataTaskProtocol {
func resume()
}

extension URLSessionDataTask: URLSessionDataTaskProtocol {}

class URLSessionDataTaskMock: URLSessionDataTaskProtocol {
typealias CompletionHandler = URLSessionMock.CompletionHandler

private let completion: CompletionHandler

init(completion: @escaping CompletionHandler) {
self.completion = completion
}

func resume() {
// create some data
completion(nil, nil, nil)
}
}

class URLSessionMock: URLSessionProtocol {
typealias CompletionHandler = (Data?, URLResponse?, Error?) -> Void
// data and error can be set to provide data or an error
var data: Data?
var error: Error?
func dataTask(
with url: URL,
completionHandler: @escaping CompletionHandler
) -> URLSessionDataTaskMock {
return URLSessionDataTaskMock(completion: completionHandler)
}
}

关于swift - 模拟 URLSession 以返回模拟的 URLSessionDataTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60985240/

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