8

わかった。私は周りを見回しましたが、私の問題に対する正確な答えは見つかりませんでした。

単体テスト (メインの実行ではない) でタイムアウト ハンドラーをテストしようとしています。

問題は[NSRunLoop mainRunLoop]、標準の実行のように単体テストで実行されていないことです。

私はこの方法でタイムアウトを行います:

NSTimer *pTimeoutHandler = [NSTimer 
    timerWithTimeInterval:2.0 
    target:self 
    selector:@selector(timeoutHandler:) 
    userInfo:nil 
    repeats:NO
];
[[NSRunLoop mainRunLoop] addTimer:pTimeoutHandler forMode:NSRunLoopCommonModes];

これは標準実行で機能します。これは、タイムアウトを設定するための推奨される方法です。

ただし、テスト実行では、これは機能しません。timeoutHandler:(NSTimer*)timerルーチンが呼び出されることはありません。

何かが実行ループに干渉しているように見えます。

実行と単体テストの両方でタイムアウトを機能させる方法はありますか?

4

2 に答える 2

10

タイマーとメインの実行ループを使用する場合、実行ループを手動で実行する必要があります。

while (continueCondition || !time_way_over_timeout)  {
    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}

タイムアウト ハンドラがcontinueCondition呼び出されたことを示すフラグとtime_way_over_timeout、現在の時刻と事前に計算された最大実行時間との比較 (ユニット テストの「タイムアウト テストのタイムアウト」を処理できます ^^)

非同期単体テストに関する次のブログ記事も参照してください: http://dadabeatnik.wordpress.com/2013/09/12/xcode-and-asynchronous-unit-testing/

于 2013-10-22T16:27:05.203 に答える