Проблемы запуска асинхронного кода в модульных тестах - PullRequest
1 голос
/ 01 июля 2019

Поэтому у меня возникают проблемы с запуском асинхронного кода в модульных тестах моего приложения.Я использую ожидания, чтобы дождаться выполнения кода до завершения теста.Асинхронный код проходит через heroku, чтобы получить значения, а затем должен вернуть их в приложение.С этим модульным тестом я пытаюсь убедиться, что соединение через heroku работает.Вот мой код:

func test() {
    let url = "https://s.herokuapp.com/test"

    let params: [String: Any] = ["account_id": AppState.sharedInstance.user.accounttoken]

    let expectation = self.expectation(description: "Testing returning value")

    let totalBalance = ""
    Alamofire.request(url, method: .post, parameters: params)
        .validate(statusCode: 200..<300)
        .responseJSON { response in
            switch response.result {
            case .success:
                print("Returned with success")
            case .failure(let error):
                let status = response.response?.statusCode
                print("Failed, status: \(status)")
                print("Here is the error: \(error)")
            }

            if let result = response.result.value {
                let balance = result as! NSDictionary
                let totalBalance = String(describing: "\(balance["Balance"]!)")
            }
            XCTAssert(totalBalance != "")
            expectation.fulfill()
    }
    waitForExpectations(timeout: 10, handler: nil)
    XCTAssert(totalBalance != "")
}

Причина, по которой я запутался, заключается в том, что у меня нет ошибок при получении асинхронного кода для возврата значений в реальном приложении.У меня только проблема времени ожидания в модульном тестировании.Я получаю две ошибки, одна из которых для XCTAssert не соответствует действительности, а другая для waitForExpectations, которая длится более 10 секунд.Вот некоторые из ошибок, которые появляются, если это помогает найти решение:

Error Messages

Вот сообщения об ошибках в текстовом виде:

2019-07-01 09: 44: 38.181971-0400 Spotbirdparking [49677: 4306598] TIC TCP Conn Failed [6: 0x6000030b7cc0]: 3: -9816 Ошибка (-9816) 2019-07-01 09: 44: 38.188607-0400 Spotbirdparking [49677: 4306598] Ошибка загрузки HTTP NSURLSession / NSURLConnection (kCFStreamErrorDomainSSL, -9816) 2019-07-01 09: 44: 38.188819-0400 Spotbirdparking [49677: 4306598] Задача. <1> Ошибка загрузки HTTP (код ошибки: -1200 [3: -9816]) 2019-07-01 09: 44: 38.189215-0400 Spotbirdparking [49677: 4306623] Задание. <1> завершено с ошибкой - код: -1200 / Пользователи / drewloughran / Рабочий стол / SpotBird / SpotbirdparkingTests /SpotbirdparkingTests.swift: 117: ошибка: - [SpotbirdparkingTests.SpotbirdparkingTests test_stripe]: сбой асинхронного ожидания: превышен тайм-аут 10 секунд, с невыполненными ожиданиями: «тестирование возвращает значение строки».

Я также справедливоновый так быстролюбая помощь будет оценена с этой проблемой.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы не должны проверять свои звонки Alamofire, выполняя реальную работу в сети. Это заставляет вас подключаться к сети каждый раз, когда вы тестируете; это ненадежно (сеть может выйти из строя) и не нужно. Мы знаем, что делает сеть! Вам также не нужно тестировать Alamofire; это не твое испытание, и опять же, ты знаешь, что он делает. Поэтому вы должны рефакторинг вашего кода для тестирования и макет сетевой вызов.

0 голосов
/ 01 июля 2019

Дрю, пожалуйста, сначала проверьте эту ошибку. Ваш запрос не загружается.

 HTTP load failed (error code: -1200 [3:-9816]) 2019-07-01 09:44:38.189215-0400 Spotbirdparking[49677:4306623] Task .<1> finished with error - code: -1200 

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

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

 Response Validation
By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling validate before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type.

Manual Validation
Alamofire.request("https://httpbin.org/get")
    .validate(statusCode: 200..<300)
    .validate(contentType: ["application/json"])
    .response { response in
        switch response.result {
        case .success:
            print("Validation Successful")
        case .failure(let error):
            print(error)
        }
    }
Automatic Validation
Automatically validates status code within 200...299 range, and that the Content-Type header of the response matches the Accept header of the request, if one is provided.

Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in
    switch response.result {
    case .success:
        print("Validation Successful")
    case .failure(let error):
        print(error)
    }
}

Удачи!

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