4

バックグラウンドで実行され、終了時にコード ブロックを実行するメソッドをテストしています。テストの非同期実行を処理するために期待を使用しています。動作を示す簡単なテストを作成しました。

- (void) backgroundMethodWithCallback: (void(^)(void)) callback {
    dispatch_queue_t backgroundQueue;
    backgroundQueue = dispatch_queue_create("background.queue", NULL);
    dispatch_async(backgroundQueue, ^(void) {
        callback();
    });
}

- (void) testMethodWithCallback {
    XCTestExpectation *expectation = [self expectationWithDescription:@"Add collection bundle"];
    [self backgroundMethodWithCallback:^{
        [expectation fulfill];

        usleep(50);
        XCTFail(@"fail test");
    }];
    [self waitForExpectationsWithTimeout: 2 handler:^(NSError *error) {
        if (error != nil) {
            XCTFail(@"timeout");
        }
    }];
}

このXCTFail(@"fail test");テストでは回線は失敗するはずですが、テストは成功しています。

また、これはコールバックで実行されたコードに時間がかかる場合にのみ発生することにも気付きました (私の場合、ファイル システム上のいくつかのファイルをチェックしていました)。これがusleep(50);、ケースを再現するために線が必要な理由です。

4

2 に答える 2

6

すべてのテストチェックの後、期待が満たされる必要があります。行をコールバック ブロックの最後に移動すると、テストが失敗します。

- (void) testMethodWithCallback {
    XCTestExpectation *expectation = [self expectationWithDescription:@"Add collection bundle"];
    [self backgroundMethodWithCallback:^{

        usleep(50);
        XCTFail(@"fail test");
        [expectation fulfill];
    }];
    [self waitForExpectationsWithTimeout: 2 handler:^(NSError *error) {
        if (error != nil) {
            XCTFail(@"timeout");
        }
    }];
}

これに関する明示的なドキュメントは見つかりませんでしたが、アップル開発者ガイドでは、fulfillメッセージはブロックの最後に送信され、非常に理にかなっています。

注:コールバックの開始時にメソッドが呼び出されるを、swift で最初に見つけました。fulfill私が知らないのは、例が正しくないか、Objective-C との違いがあるかどうかです。

于 2015-03-31T10:21:57.637 に答える