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 { //問題なく完了 } }