12

初心者の質問で申し訳ありませんが、接続をテストしようとしていますが、完了ハンドラーが実行される前にテストが終了するため、リクエストの戻りを確認できません。説明するには:

-(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 は常に nil になります。sendAsynchronousRequest: メソッドから何らかの応答があるまでテストを強制的に待機させるメカニズムがあります。前もって感謝します。

4

3 に答える 3

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ステータスの通知に失敗した場合、待機呼び出しがタイムアウトになり、テストが失敗します (当然のことです)。

于 2013-10-01T23:13:46.393 に答える
5

GHUnit バージョンに基づく別の代替 XCAsyncTestCase を次に示します。

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

使い方は同じで、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];
}
于 2013-10-23T14:07:44.230 に答える
4

これは XCode 6 に含まれるようになりました。

Obj-C の例:

Xcode 6 での XCTest と非同期テスト

于 2014-12-29T21:10:49.337 に答える