Что я должен включить в мою функцию проверки сети? - PullRequest
0 голосов
/ 16 января 2019

Я хочу проверить мой код сетевого запроса. Тестирование не является моей сильной стороной, и я делаю это главным образом для того, чтобы лучше создавать тестируемый код. Я обычно использую Alamofire, но хочу обойти это для юнит-тестов. Я создал такой протокол:

protocol NetworkSession {
    func request(
        _ endpoint: Endpoint,
        method: HTTPMethod,
        completion: @escaping (Result<<DataResponse<Any>>, RequestError>) -> ()
    )
}

Я соответствую этому протоколу в моем классе NetworkSessionManager:

final class NetworkSessionManager : NetworkSession {
    func request(
        _ endpoint: Endpoint,
        method: HTTPMethod,
        completion: @escaping (Result<<DataResponse<Any>>, RequestError>) -> ()) {
        guard let url = endpoint.url else {
            return completion(.failure(.couldNotEncode))
        }
        Alamofire.request(url, method: method, headers: headers)
            .validate()
            .responseJSON { response in

                completion(.success(response))
            }
        }
    }
}

Затем в моем BackendClient классе я делаю инъекцию и называю мой NetworkSessionManager следующим образом:

private let session: NetworkSession

init(session: NetworkSession = NetworkSessionManager()) {
    self.session = session
}


func someFunction(...) {
    session.request(...)
}

Теперь я знаю, что мне нужно создать фиктивный класс, соответствующий NetworkSession, но я не уверен, что мне в нем делать? Как проверить все возможности и возвращенные данные? На моем сервере есть разные конечные точки, которые возвращают разные типы данных. Если бы кто-то мог указать мне на следующие шаги, которые я должен предпринять, я был бы очень благодарен.

final class NetworkSessionManagerMock : NetworkSession {
    func request(
        _ endpoint: Endpoint,
        method: HTTPMethod,
        completion: @escaping (Result<<DataResponse<Any>>, RequestError>) -> ()) {
        ???
    }
}

1 Ответ

0 голосов
/ 16 января 2019

Я приведу два примера, которые, как мы надеемся, могут дать вам что-то, с чего можно начать издеваться над NetworkSession.

Во-первых, вы можете добавить дополнительные свойства к вашему фиктивному классу, которые поддерживают вставку значений для тестирования различных случаев. Сейчас я покажу ситуацию с ошибками и возврат.

enum MyError: Swift.Error {
    case failed
}

final class NetworkSessionManagerMock : NetworkSession {
    var myError: MyError?
    var dataResponse: Any? // This should hopefully be typed to something

    func request(
        _ endpoint: Endpoint,
        method: HTTPMethod,
        completion: @escaping (Result<<DataResponse<Any>>, RequestError>) -> ()) { [weak self] in 
        if let myError = self?.myError {
            // Send error with completion handler
        } else if let dataResponse = self?.dataResponse {
            // Send data response
        }
    }
}

Идея в том, что вы создаете экземпляр макета в своем тесте, а затем устанавливаете переменные по мере необходимости для проверки соответствующей части. Ваш макет будет продолжаться в обычном режиме.

Я не проверял этот код на правильность синтаксиса, поэтому дайте мне знать, если в нем есть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...