UIApplication applicationState должен использоваться только из основного потока - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь провести некоторое модульное тестирование API.Вот актуальная функция.

 func registerApi(path: String, player_id: Int, contest_id: Int, country_id: Int,  success: () -> Void)
{
    ServiceHelper.sharedInstance.sendRequest(path: "register-country",
                                             params: ["api_token": Constants.USER_INFO["api_token"].rawValue,
                                                      "player_id": player_id,
                                                      "country_id": country_id,
                                                      "contest_id": contest_id],
                                             showSpinner: true,
                                             completionHandler:
        { (response, error) in

            if (error != nil)
            {
             Test to be failed
            }
            else
            {
                Test Passed

            }
    })
}

А теперь вот функция тестирования для модульного тестирования.

func testApiWorking()
{
    let controller = WorldCupChooseCountryVC()

    let expected = XCTestExpectation(description: "Some Countries to return")


    controller.registerApi(path: "get-country", player_id: 163, contest_id: 1, country_id: 1) { success in if success { expected.fulfill() }
    else{
        XCTFail()
        }
    }

    waitForExpectations(timeout: 1.0) { (_) -> Void in
    }

}

Но всякий раз, когда я пытаюсь проверить это, я получаю следующую ошибку.

[UIApplication applicationState] must be used from main thread only

Однажды, он также прошел хорошо, тест не прошел, но он запустился.Но это даже не работает сейчас.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

(Вопрос изменился с вопроса о главном потоке на то, как определять и вызывать замыкания. Этот ответ изменился, чтобы отразить это.)

[UIApplication applicationState], скорее всего, вызывается из GeneralHelper.

Скорее всего, служебный помощник делает сетевой запрос в фоновом потоке.

Итак, чтобы убедиться, что GeneralHelper вызывается в основном потоке, выполните его через DispatchQueue.

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

func registerApi(path: String, player_id: Int, contest_id: Int, country_id: Int,  completion: ((Bool) -> Void)? = nil)
{
    let helper = ServiceHelper.sharedInstance
    let params = [
        "api_token": Constants.USER_INFO["api_token"].rawValue,
        "player_id": player_id,
        "country_id": country_id,
        "contest_id": contest_id
    ]
    helper.sendRequest(path: "register-country", params: params, showSpinner: true) { (response, error) in
        var success = true

        if let error = error
        {
            // Do stuff on failure.
            success = false
        }
        else
        {
            // Do stuff on success
        }

        // Call completion handler from 'registerApi'
        completion?(success)
    })
}

В своем тесте вы можете теперьдобавить параметр для проверки на успех.

func testApiWorking()
{
    let controller = WorldCupChooseCountryVC()

    let expected = XCTestExpectation(description: "Some Countries to return")

    controller.registerApi(path: "register-country", player_id: 163, contest_id: 1, country_id: 1) { success in
        if success {
            // Test success
        } else {
            // Test fail
        }

        expected.fulfill()
    }

    waitForExpectations(timeout: 30) { (_) -> Void in
    }
}
0 голосов
/ 29 мая 2018

Main Thread Checker обнаруживает недопустимое использование AppKit, UIKit и других API из фоновых потоков.completionHandler, кажется, обновляет пользовательский интерфейс, поэтому, возможно, переместите эту часть в отдельный метод и вызовите ее из очереди отправки.

DispatchQueue.main.async {
     handleResponseOrError(response, error)
}
...