40
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

XCTestで非同期ブロックのテストを書く

Posted at

XCTestで、こんな感じで非同期処理のテストを書いた場合、

[SNSUser loginWithBlock^(SNSUser* user, NSError* error) {
    XCTAssertNotNil(user, @"hoge");
    XCTAssertNil(error, @"fuga");
}];

一見テストが通ったと見せかけて、実はBlocksの中が
実行される前にテストが終わっていたりします。
(Blocks内はテストしてないけどTest Succeededってなる)
地味に最初はひっかかる人もいるんではないでしょうか。

XCTestでは非同期処理のテストができないと思っている人を時々見かけますが、
Blocksの中に書いた処理が走るまで待機させることで一応テストできます。

// テスト実行完了フラグ
__block BOOL isFinished = NO;

[SNSUser loginWithBlock^(SNSUser* user, NSError* error) {
    XCTAssertNotNil(user, @"hoge");
    XCTAssertNil(error, @"fuga");
    // Blocksの中のテストが終わったら完了フラグをYESに
    isFinished = YES;
}];
// 完了フラグがYESになるまで待機
while (!isFinished) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
XCTAssertTrue(isFinished, @"");

上記例のテストコードだと最大で1秒まで待機するようにしていますが、
念のためisFinishedの値を確認しておくと安心かなと思います。

40
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?