XCTest Asyn c Функция Swift - PullRequest
       75

XCTest Asyn c Функция Swift

0 голосов
/ 04 августа 2020

Я новичок в XCTest, я структурировал свой код в Model, View, Controller

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

Контроллер:

func loadData() {
    Model.provideData { response in
        if response != nil {
            view.refresh()
        }
    }
}

Просмотр:

func refresh() {
    isViewLoaded = true
}

и вот мой XCTest

func testLoadData() {
    let sut = Controller()
    let mockView = View()
    mockView.setController(controller: sut)
    controller.loadData()
    /** HERE is the problem, because it is a ASYNC call, i need to wait for the flag is set **/
    XCTAssertTrue(mockView.isViewLoaded, "isViewLoaded equals to true")
}

Я знаю, что могу

let expectation = expectation(description: "wait for isViewLoaded set to true")

, но где мне положить expectation.fulfill()?

waitForExpectation(timeout: 5, handler: nil)

Любая помощь приветствуется. Спасибо

1 Ответ

2 голосов
/ 04 августа 2020

Вам нужно, чтобы ваш loadData имел обработчик завершения и, следовательно, мог уведомлять его вызывающих, когда функция asyn c завершена.

func loadData(completion: @escaping () -> Void) {
    Model.provideData { response in
        if response != nil {
            view.refresh()
        }
        completion()
    }
}

А затем в вашем тесте сделайте expectation.fulfill в completion из loadData.

func testLoadData() {
    let expectation = expectation(description: "wait for isViewLoaded set to true")
    let sut = Controller()
    let mockView = View()
    mockView.setController(controller: sut)
    controller.loadData {
        expectation.fulfill()
    }
    waitForExpectation(timeout: 5, handler: nil)
    XCTAssertTrue(mockView.isViewLoaded, "isViewLoaded equals to true")
}
...