11

私はSenTestingKitを使用して、クライアント側のコードとサーバー間の統合テストを行う方法を探していました。運がなかった。コードがメソッドで実行されると、オブジェクトが破棄されるようです。これは、非同期応答がセレクターを呼び出さないことを意味します。

質問:

  1. オブジェクトを破壊するのにふさわしいと思う時まで、オブジェクトをインスタンス化しておく方法はありますか?テストが完了した後?
  2. そうでない場合、テストが完了するまでブロックする(つまり、同期的に動作する)クラスを作成するにはどうすればよいですか?

参考までに、期待される結果がわかっているテストサーバーを実行しています。

私はかなりのグーグルをしましたが、これについて何らかの形で証拠を見たことがありません。他の人も興味を持ってくれると思います。

4

5 に答える 5

30

セマフォを使用して、非同期メソッドが終了するまで待機できます。

- (void)testBlockMethod {
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    // Your block method eg. AFNetworking
    NSURL *url = [NSURL URLWithString:@"http://httpbin.org/ip"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);
        STAssertNotNil(JSON, @"JSON not loaded");
        // Signal that block has completed
        dispatch_semaphore_signal(semaphore);
    } failure:nil];
    [operation start];

    // Run loop
    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
    dispatch_release(semaphore);

}

http://samwize.com/2012/10/03/sentestingkit-does-not-support-wait-for-blocks/

于 2012-10-03T14:21:25.013 に答える
9

2つのオプション:

  • GHUnitに切り替えます。これには、非同期イベントの待機のサポートが実際に含まれています
  • テストの設計を絞り込んで、現状のままでテストできるようにします。たとえば、コントローラーコードによってセレクターが切り離されて実行されることをテストし、(個別に)このセレクターが本来の動作を実行することをテストします。これらの両方が機能する場合は、コントローラーが正しい作業を切り離すことを確信できます。
于 2011-05-31T16:18:39.473 に答える
5

Kiwiは非同期テストをサポートしていますKiwiは、SentTestingKit(OCUnit)を拡張するiOS用のBehavior Driven Development(BDD)ライブラリであるため、セットアップと使用が簡単です。

また、チェックアウト:

于 2011-05-31T16:21:45.930 に答える
3

このプロジェクトhttps://github.com/hfossli/AGAsyncTestHelperには非常に便利なマクロがあります

WAIT_WHILE(<expression_to_evaluate>, <max_duration>);

そのようにテストを書くことができます

- (void)testDoSomething {

    __block BOOL somethingIsDone = NO;

    [MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:^{
        somethingIsDone = YES;
    }];

    WAIT_WHILE(!somethingIsDone, 1.0); 
    NSLog(@"This won't be reached until async job is done");
}
于 2013-07-26T09:57:42.383 に答える
0

SenTestingKitAsyncプロジェクトをチェックアウトします-https ://github.com/nxtbgthng/SenTestingKitAsync。関連するブログはこちら-http://www.objc.io/issue-2/async-testing.html

于 2013-08-19T09:01:42.513 に答える