2010-11-29 10 views
1

私は非同期要求のテストを自動化しようとしていますが、テスト機能が待機している間は別のスレッドで何も実行できませんでした。ここ は、テスト関数である:OCUnitはバックグラウンドスレッドのコードに依存できますか? (非同期要求をテストするため)

- (void) testBoxManagerConnexionStatus 
{ 
    ControlSender* cs = [ControlSender get]; 
    requestShouldSucceed = YES; 
    [cs startCheckingReachabilityWithDelegate:self]; 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:TIMEOUT_INTERVAL+1.0]]; 

    STAssertTrue(downloadComplete, @"Download should be over by now"); 
} 

私のテストクラスは、コールバックメソッドをこのように実装しています

- (void)controlSender:(ControlSender *)controlSender sentSuccessfullyCode:(FreeboxControl)code 
{ 
    if (requestShouldFail) { 
     STAssertTrue(NO, @"Request should have failed"); 
    } 
    downloadComplete = YES; 

} 
- (void)controlSender:(ControlSender *)controlSender couldntSendCode:(FreeboxControl)code details:(NSHTTPURLResponse*)details 
{ 
    if (requestShouldSucceed) { 
     STAssertTrue(NO, @"Request should have succeded"); 
    } 
    downloadComplete = YES; 
} 

をしかし、私のいつものコードは何も起こりません別のスレッドで何かを実行しようとするたびに。割り当てられたとき、例えば、NSURLConnectionは、そのデリゲートメソッドを呼び出すことはありません:

m_connexion = [[NSURLConnection alloc] initWithRequest:m_networkRequest delegate:self]; 

-connectionDidFinishLoading:も、このような呼び出しのため-connection:didFailWithError:

同じことどちら:

[self performSelectorInBackground:@selector(BG_startCheckingReachabilityWithDelegate:) withObject:delegate]; 

ナッシングをバックグラウンドで呼び出されますテストを実行する。 同じコードは、テストの外側でうまく動作します。 OCUnitで非同期URLリクエストをテストする方法はありますか?

ありがとうございます。

答えて

2

あなたはhttps://github.com/danielpunkass/RSTestingKitを見ることができます。ユニットテストで実行ループを待つ方法があります。彼のスライドは、いくつかの背景のためにhttp://www.red-sweater.com/talks/UnitTesting.pdfに見えます。始めるのに役立つ情報があります。

+0

これは本当に興味深いものです。ありがとう、私はそれを試してみると、これが動作する場合はお知らせください。 – mbritto

1

このようなリクエストをバックグラウンドスレッドで試すことはできますが、そうしたくない場合もあります。あなたの正気のために、あなたのテストが外部サービスに依存しないようにしてください。リモートサービスがダウンしている場合はどうなりますか?あなたのテストは失敗します。リモートサービスがエラーを返すとどうなりますか?あなたのテストは失敗しますか?リモートサービスが有効なリクエストに対するエラーで応答したときに、コードが何をしたいのですか?あなたは(一貫して)することはできません。テストが合格しても、リモートサービスが応答するまでの時間に応じて、遅く実行されます。

テストの目的でリモートサービスへの依存関係を除外すると、人生はより簡単になります。より詳細な推論については、this answer(およびそれに関連する質問)を参照してください。

+0

ありがとうアダム、私はすでに解決策を探して、あなたの以前の記事を読んだ。私がまだ非同期呼び出しをテストしようとしている理由は、リモートサービスではなく、ローカルネットワーク(Wi-Fi)セットトップボックスがあるからです。 – mbritto

+0

(コメントスイートは、返信キーがコメントを検証するようです)このアプリはこのセットトップボックスのリモートコントロールです。メーカーがAPI(URL、パラメータなど).Plusを変更しないようにしたいと思いますiphoneでスリープ状態から外れるときに迷惑なwifiの問題をデバッグするのに役立ちます。 – mbritto

+0

私はアダムに同意しません。あなたが1つのユースケースから来て、これをあまりに広く適用しているように思えます。リモートサービスに依存するテストケースは完全に有効であり、エンドツーエンドの統合を適切にテストする唯一の方法です。あなたは 'リモートサービスが返ってエラーが出たらどうなるでしょう?'と尋ねます - これは有効なテスト結果です!私はあなたが「スタブアウト依存」を得ていることを見ています。コードのいくつかの領域では、確かに。あなたがテストしている「ユニット」によって異なります。 –

関連する問題