2013-10-01 9 views
12

申し訳ありませんが、私は接続をテストしようとしていますが、完了ハンドラの前にテストが終了するため、リクエストの返信を確認できません。実行する機会。 ilustrateするには:sendAsynchronousRequestをテストする方法:XCTestで

-(void)testConnection 
{ 

    [[Conector sharedInstance] performAsynchronousRequestWithServerRequest:_srvRequest completionHandler:^(RequestAsynchronousStatus finishStatus, NSData *data) { 
     if (finishStatus == RequestAsynchronousOK){ 
      _data = data; 
      NSLog(@"Data OK"); 
     } 
    }]; 

    XCTAssertNotNil(_data, @"Data was nil"); 

} 

私が主張しようとすると、完了ハンドラがまだ実行されなかったため、_dataは常に、ゼロになります。 sendAsynchronousRequest:メソッドから何らかの応答があるまで、テストを強制的に待機させるメカニズムがあります。 ありがとうございます。

答えて

22

これは、あなたが必要な正確に何のようになります。

XCAsyncTestCase:非同期可能SenTestCaseサブクラスを。

- (void)testConnection 
{ 
    [[Conector sharedInstance] performAsynchronousRequestWithServerRequest:_srvRequest completionHandler:^(RequestAsynchronousStatus finishStatus, NSData *data) { 
     if (finishStatus == RequestAsynchronousOK) 
     { 
      _data = data; 
      [self notify:XCTAsyncTestCaseStatusSucceeded]; 
      NSLog(@"Data OK"); 
     } 
    }]; 

    [self waitForTimeout:10]; 

    XCTAssertNotNil(_data, @"Data was nil"); 
} 

お知らせwaitForTimeout:コールとnotify:呼び出し:

基本的に、あなたはこのようなテストを記述する必要があります。テストには10​​秒で十分ですが、要求自体に依存します。

あなたも、より具体的な取得し、特定のステータスを待ち、そのような可能性:

[self waitForStatus: XCTAsyncTestCaseStatusSucceeded timeout:10]; 

この方法は、接続がXCTAsyncTestCaseStatusSucceeded状況を通知するために失敗した場合、待機コールがタイムアウトになると、あなたのテストが失敗します(それはすべきである)。

https://github.com/iheartradio/xctest-additions

使い方は同じ、ただのインポートおよびサブクラスXCAsyncTestCaseです:

+0

おかげで男を、それは私が探していたまさにです! –

+1

XCAsyncTestCaseのreadmeに記載されている既知の問題の1つは、 "XCodeビルドボットで実行するとテストがハングする"ことがわかっていると便利です。ビルドボットを使っているなら、iheartradioで 'xctest-additions'を見るかもしれません。 – eremzeit

5

はここで、GHUnitのバージョンに基づいてXCAsyncTestCase別の代替です。

@implementation TestAsync 
- (void)testBlockSample 
{ 
    [self prepare]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){ 
     sleep(1.0); 
     [self notify:kXCTUnitWaitStatusSuccess]; 
    }); 
    // Will wait for 2 seconds before expecting the test to have status success 
    // Potential statuses are: 
    // kXCTUnitWaitStatusUnknown, initial status 
    // kXCTUnitWaitStatusSuccess, indicates a successful callback 
    // kXCTUnitWaitStatusFailure, indicates a failed callback, e.g login operation failed 
    // kXCTUnitWaitStatusCancelled, indicates the operation was cancelled 
    [self waitForStatus:kXCTUnitWaitStatusSuccess timeout:2.0]; 
} 
関連する問題