なぜかテスト関連のツールはマジカルな実装が多いのですが、自分は愚直にテストをしたいので愚直なライブラリを書きました。 書いたのは半年前だったのですが、需要があったのでCocoaPodsに登録しました。

ざっくり説明すると、以下のようなものです。

  • 引数に渡したblockの実行中はNSRunLoopを回してテストケースが終了しないようする
  • *finish = YESとするとblockから抜ける
  • タイムアウトした場合は例外を投げてテストケースを失敗させる

NSRunLoop+PerformBlock

- (void)testPerformBlockAndWait
{
    // 1
    __block BOOL flag = NO;

    [[NSRunLoop currentRunLoop] performBlockAndWait:^(BOOL *finish) {
        double delayInSeconds = 2.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_after(popTime, queue, ^(void){
            // 2
            flag = YES;
            *finish = YES;
        });
    }];

    // 3
    XCTAssertTrue(flag);
}