2017-02-16 5 views
1

は、次のユニット・テストを考えてみましょう:ユニットテストでのXCTestExpectationのメソッド呼び出しのタイミング/配置が正しいか?

- (void)testSample { 
    XCTestExpectation *expectation = [self expectationWithDescription:@"Sample"]; 

    [self.manager loadAllSuccess:^{ 
     [expectation fulfill]; 

     NSArray *data = [self.manager dataForIndex:0]; 

     // Correct count of data is 10, not 44 - this should fail. 
     XCTAssertEqual(44, data.count); 
    } failure:^(NSError *error) { 
     [expectation fulfill]; 

     XCTFail(@"Error encountered"); 
    }]; 

    [self waitForExpectationsWithTimeout:60 handler:nil]; 
} 

私は知ら失敗ケースでいくつかの問題に直面しています。データ配列に10個のアイテムしか存在しないにもかかわらず、テストは正常に終了します。

私はブロックの下部に[expectation fulfill]電話を入れた場合、私は値が10

であることを修正するまで、XCTAssertEqual(44, data.count)メソッドを呼び出した後、テストが期待通りに動作し、失敗したが、これは既知の問題ですか?私は、非同期 callback-の終わりに)

+0

非同期コールバックの最後に必ずfulfill()を呼び出します。これにより、テストが完了する前に実行ループが終了する可能性のある競合状態を前もって設定できます。テストに複数の期待値がある場合、各期待値がwaitForExpectationsWithTimeout()で指定されたタイムアウト以内にfulfill()を実行しないかぎり、テストは成功しません。 http://nshipster.com/xctestcase/でこれを見つけました – Zach

答えて

2

http://nshipster.com/xctestcase/

によると、必ず(履行を呼び出し...私は非常に最後の最後であることを呼ぶべきであると言ってドキュメントを読み込むことができませんしてきました早期に期待を満たすことで、レースをセットアップすることができます。 テストが完了する前に実行ループが終了する可能性のある状態。 テストに複数の期待値がある場合、 期待値が waitForExpectationsWithTimeout()に指定されたタイムアウト以内にfulfill()を実行しない限り、テストは合格しません。

ちょうどこれが見つかりましたが、100%正確であるかどうかはわかりませんが、私はこれを他の場所に記載している他のドキュメントは見られません。

0

はい、あなたの期待が満たされたときにfulfillに電話する必要があります。テストが終了する前にアサーションが実行されていることが予想される場合、アサーションが実行された後でのみ、あなたは期待を満たす必要があります。

@ Zachの回答では、NSHipsterを参照すると、テストが完了する前にテストが実行を停止する可能性があります。テストが待っているのは期待通りです。成功と失敗のブロックはテストの知識なしに実行されています。予想が満たされるとすぐに、テスト実行は停止し、それ以降のコードは実行されません。

あなたのコードは、成功した場合と失敗した場合の期待値を満たしているため、結果にかかわらず、このテストは常に成功すると思われます。私は、あなたがテストが合格したときに何が働いているのか、それが失敗したときに何が壊れているのかを知るために、さらにデバッグする必要なしに、1つの場所に期待を満たすことができる場所の数を制限することをお勧めします。このテストを2つに分割する必要があります.1つは、成功ブロックでは期待されているが失敗ブロックではなく、2つ目のテストではその逆です。

関連する問題