なんとかするから、なんとかなる

エンジニア関係のことを書きます

iOS XCTestで非同期処理の完了を待つ

English version below

はじめに

タイトル通りです。

APIRequestなどXCTestで疎通確認をした際に、非同期処理の完了を待ちたいことはよくあります。

その方法を簡単に紹介

解決方法

expectationを使います。

次のように書いて待つことを宣言

let expect = expectaion(description: "テストログ用の文字列")

上記のexpectが満たされたこと示すために、非同期処理完了時にfulfillを呼びます。

expect.fulfill()

最後にwaitForExpectations(timeout:handler:)でタイムアウト時間などを指定して、完了時の処理をhandlerに渡します。

waitForExpectations(timeout: 5) { (error) in
    // 何かの処理
}

ね。簡単でしょ。

サンプルコード

こんな感じで使います。

let request = SomeRequest()
let expect = expectation(description: "SendMyRequest")
APIClient.send(request: request) { (result) in
    switch result {
    case .success(let response):
        expect.fulfill()
    case .failure(let error):
        XCTFail("Failuer in API Client")
    }
}
waitForExpectations(timeout: 5) { (error) in
    if let error = error {
    //なにかしらエラー発生(タイムアウトなど)
        print(error)
        XCTFail("ExpectaionTimeOut")
    } else {
    //問題なく完了
    }
}