1

私は最近、メディア CMS のクライアントとして機能する iOS 企業アプリを採用しました。別の言い方をすれば、Web アプリは、ビデオ、画像スライド ショー、および静的/オフライン HTML ファイルのカタログを管理します。iOS アプリは Web アプリに接続し、オフラインで使用するためにこのコンテンツをそれ自体にダウンロードします。

ホット スポットは、iOS と Web アプリケーション間の同期ロジックです。これら 2 つのプロジェクト間のロジックを単体テストするためのアドバイスはありますか?

4

1 に答える 1

1

ええ、あなたはいくつかを「だます」必要があります。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);

次に、stopRunLoopivar をTRUE.

于 2012-08-07T17:25:00.663 に答える