Я хочу смоделировать URLSession
и вернуть смоделированную URLSessionDataTask
.
В макет URLSession
Я создаю протокол
protocol URLSessionProtocol {
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
}
, который URLSession
может затем соответствовать в расширение
extension URLSession: URLSessionProtocol {}
Теперь я хочу сделать то же самое для URLSessionDataTask
и реализовать аналогичный протокол и расширение для него. Мне нужно это сделать, поскольку способ, которым я звоню URLSession
, требует использования func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
protocol URLSessionDataTaskProtocol {
func resume()
}
extension URLSessionDataTask: URLSessionDataTaskProtocol {}
Итак, мой макет URLSessionDataTask
настроен следующим образом:
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()
}
}
Не работает, поскольку URLSessionDataTaskMock
в URLSessionProtocol
не является правильным типом возврата - мне нужно вернуть URLSessionDataTask
.
Я не могу привести свой URLSessionDataTaskMock
к URLSessionDataTask
, так как типы не связаны между собой.
Как я могу вернуть URLSessionDataTaskMock
из моего URLSessionProtocol
?