Ложный URLSession для возврата ложного URLSessionDataTask - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу смоделировать 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?

1 Ответ

1 голос
/ 02 апреля 2020

Вы, вероятно, можете сойти с рук что-то вроде этого. Ключом будет ваш связанный тип в вашем URLSessionProtocol

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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...