2017-09-29 2 views
1

期待通りに動作する数々の非同期ユニットテストがあります。しかし、私がスーツですべてのテストを実行すると、彼らはお互いが完了するのを待たずに、次のテストの実行が開始されると非同期コールバックが保留されます。私が望むのは、各テストが前のテストでの期待を待ってから実行することです。これらのテストでは共有データベースが使用されるため、重複すると複雑さが増し、スイートとして実行するとテストが失敗します。XCodeで次の単体テストを開始する前にXCTestExpectationを待つ

- (void)testSignIn { 
// This is an example of a functional test case. 
// Use XCTAssert and related functions to verify your tests produce the correct results. 

XCTestExpectation *expectation = 
[self expectationWithDescription:@"Expectations"]; 

[_userManager signInWithUsername:kUserEmail andPassword:kUserPassword 
         success:^{ 
          XCTAssertNotNil([_userManager getCurrentUser]); 

          XCTAssertNotNil([_userManager getCurrentUser].plan); 
          XCTAssertTrue([_userManager getCurrentUser].plan.liveStream == TRUE); 

          [expectation fulfill]; 

         } failure:^(EDApiError *apiError) { 
          XCTAssertTrue(FALSE); // Should not fail 
          [expectation fulfill]; 

         }]; 

[self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) { 
    if (error) { 
     NSLog(@"Timeout Error: %@", error); 
    } 
}]; 

}

+0

これは意味をなさない。いずれかの方法が期待を満たす必要がある次のテストを開始する前に、1つのテストが失敗/成功する必要があります。私が考えることができるのは、 'testSignIn'が単一のテストの2箇所から呼び出されることだけです。 1. 1回のテストで2回実行していないことを確認してください。 2.さらに5秒のタイムアウトは少し小さすぎます。私は少なくとも30秒間それを作ることをお勧めします。 – Honey

+1

さまざまな記述文字列を持つ必要があるように見えます。私はすべての鉱山を同じ弦にセットしていたので、私が見ていた振る舞いを引き起こしたようです。 – deepwinter

+0

(私の前のコメントを削除しました)私はそれを理解しようとしています。私はまだ2つのテストが同時に実行されていることを意味しません。だからこそ、私はこれが根本的な原因ではないと推測しています... – Honey

答えて

0

期待が満たされているまで、各テストの完了を停止するXCTWaiterまたはwaitForExpectations(timeout:handler:)を使用します。

このブログの記事は、あなたが非同期テストを書くときに出くわす可能性があり、それらを防ぐためにどのように、より複雑な落とし穴のいくつかを説明しますhttps://jeremywsherman.com/blog/2016/03/19/xctestexpectation-gotchas/

+0

上記の更新された質問を参照してください。私はwaitForExpectationを使用していますが、テストが完了するのを待っているようには見えません。次のテストを続行し、タイムアウトで完了するまで、自分の時間内に完了します(成功または失敗)。 – deepwinter

0

私はあなたがメインスレッド上の期待を満たすために必要があることがわかりました - 重要なあなたの場合非同期補完ブロックが別のスレッドで実行されている可能性があります。また、以前に実行された不良テストによって問題が引き起こされる可能性があることもわかりました。したがって、必ずしもエラーが発生したテストでは発生しません。

また、多くの非同期ブロック(私は狂ったスレッドの安全性テスト、またはリソースへの排他的アクセスを検査するテストが期待どおりに動作し、期待どおりの順序でこれを行う)期待を満たせば、テストは次のテストに移りますが、それ以降にたくさんの非同期ブロックを実行した場合、まだ実行されている可能性があります。

関連する問題