Как загрузить нулевые данные с помощью подкласса URLProtocol? - PullRequest
0 голосов
/ 16 июня 2020

Я сейчас пробую метод заглушки моих сетевых запросов без необходимости имитировать URLSession с помощью URLProtocol.

Пока что он работает довольно хорошо и работает позвонив по номеру self.client?.urlProtocol(_ URLProtocol, didLoad: Data). Однако я не могу передать nil, поэтому я могу проверить, как мой сетевой класс обрабатывает отправку успешного ответа без данных (например, кода HTTP 204). По умолчанию URLProtocol возвращает пустой объект Data, а не nil, поэтому мне кажется, что это то, что мне нужно установить вручную.

Есть ли способ вернуть успешный ответ с нулевыми данными с использованием подкласса URLProtocol? После поиска в документации я не могу найти ничего, что выскакивает, хотя кажется, что это возможно.

URLProtocolStub

// Custom URLProtocol to be used in place of Apple's HTTP protocols when
// testing network code
class URLProtocolStub: URLProtocol {
    static var testURLs = [URL?: Data]()

    override class func canInit(with request: URLRequest) -> Bool {
        return true
    }

    override class func canonicalRequest(for request: URLRequest) -> URLRequest {
        return request
    }

    override func startLoading() {
        if let url = request.url,
            let data = Self.testURLs[url] {
            self.client?.urlProtocol(self, didLoad: data)
        }
        client?.urlProtocolDidFinishLoading(self)
    }

    override func stopLoading() {}
}

Код для тестирования

func requestCards(completionHandler:@escaping (Result<[Card],NetworkCallError>) -> Void ) {
    session.dataTask(with: URL(string: "https://deckofcardsapi.com/api/deck/new/draw/?count=52")!) { data, response, error in
        guard let data = data else {
            completionHandler(.failure(.noData))
            return
        }

1 Ответ

0 голосов
/ 23 июля 2020

Обновите определение testsURLs, чтобы данные ответа были равны нулю, и вызовите URLProtocolClient.urlProtocol(_:didFailWithError:), когда это будет.

Ваша реализация startLoading() будет выглядеть так:

static var testURLs = [URL?: Data?]()

override func startLoading() {
    if let url = request.url,
        let data = Self.testURLs[url] {
        self.client?.urlProtocol(self, didLoad: data)
    } else {
        let error = NSError(domain: "", code: 0, userInfo: nil)
        self.client?.urlProtocol(self, didFailWithError: error)
    }
    client?.urlProtocolDidFinishLoading(self)
}

Затем добавьте тестовый пример:

myURLProtocolStub.testURLs["http://empty-data.com"] = nil
...