ええ、あなたはいくつかを「だます」必要があります。NSRunLoop
これを行う 1 つの方法は、のメソッドを使用することrunUntilDate:
であり、これが私のアプローチでした。
基本的に、Web コードに Web と通信する機会を与えるには、Unit-Test を一種のビジー待機状態にして、実際に誰もが何らかの作業を行えるようにする必要がありますが、ユニットで「チェックバック」することも必要です。 -定期的にテストして、操作が完了しているかどうかを確認してください。
これが私の「仕事をする」方法です:
-(BOOL)runLooperDooper:(NSTimeInterval)timeoutInSeconds{
NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds];
// loop until the operation completes and sets stopRunLoop = TRUE
// or until the timeout has expired
// stopRunLoop is a instance variable of the UnitTest object... take care to reset at the start or end of each test!
while (!stopRunLoop && [giveUpDate timeIntervalSinceNow] > 0)
{
// run the current run loop for 1.0 second(s) to give the operation code a chance to work
NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
[[NSRunLoop currentRunLoop] runUntilDate:stopDate];
}
return stopRunLoop;
}
したがって、各単体テストでは次のようになります。
NSTimeInterval testSpecificTimeout = 60; //60 seconds or however long you need...
[self runLooperDooper:testSpecificTimeout];
STAssertTrue(stopRunLoop, @"Failed to complete before runloop expired after %f seconds", timeoutInSeconds);
次に、stopRunLoop
ivar をTRUE
.