2017-03-31 10 views
3

私はAndroidアプリをテストするためにEspressoを使い始めていますが、何か問題があります。私は通常の方法でフラグメントを置き換えボタンでの活動があります。私のテストではAndroid Espressoはフラグメントの読み込みを待たずに

public void onClick(View v) { 
    final FragmentTransaction t = getFragmentManager().beginTransaction(); 
    t.setCustomAnimations(R.animator.fragment_slide_in_up, 0); 
    t.replace(R.id.fragment_container, 
     LogInFragment.newInstance(), LogInFragment.TAG) 
     .addToBackStack(LogInFragment.TAG); 
    t.commit(); 
} 

を、私は新しいフラグメントで送信ボタンをクリックして、ちょうど新しいフラグメントが表示されていることを確認してください。

onView(withId(R.id.login_btn)) 
    .perform(click()); 
Thread.sleep(500); 
onView(withId(R.id.email_input)) 
    .check(matches(isDisplayed())); 

私はテストからThread.sleep()を削除した場合、テストは私が活動コードからsetCustomAnimations()を削除しても、失敗します。

すべてのアニメーションは、指示に従って携帯電話でオフになっています。私の理解では、エスプレッソはUIスレッドの状態を知っていて、すべてが準備が整うまで待つことになります。しかし、もし私がonView(withId(R.id.widgetOnNewFragment))を実行すると、毎回爆発する。新しいフラグメントを表示するたびにThread.sleep(500)を追加する必要があります。

何か不足していますか?私は私のテストコードに数十のThread.sleep()を追加する必要はないと思う。

+1

IdlingResourceの使用 –

答えて

3

エスプレッソフレームワークは特定のメインUIスレッドアクティビティを待機していますが、アニメーションにはIdlingResourceアプローチが必要です(Honzaが示唆しているように)。

このコンセプトではgood tutorials、さらにはdetailed implementationsです。

実際には、アニメーションはUIの機能テストにほとんど影響しないため、ほとんどの開発者はアニメーションを無効にします。 IMOの場合、これは実際のユーザーエクスペリエンスにマップされないため(ほとんどの人が電話を購入し、デフォルト設定で使用するため)、anti-patternです。これはあなた自身を作る必要がある決定です。機能要件の一部としてアニメーションを含める場合は、waysがありますが、テストを再実装して書き直す必要があります。

+0

したがって、fragmentTransaction.replace()は常にアニメーションであり、常にIdlingResourceが必要ですか? –

+0

はい。私の経験では、fragmentTransaction.commit()はメインスレッドと非同期であり、Espressoの実行をブロックしません。 .commitNow()を試しましたか?ドキュメントでは、ここで使用するFragmentTransactionの非同期性について説明しています。https://developer.android.com/reference/android/app/FragmentTransaction.html –

+0

誠にありがとうございます。 –

関連する問題