2016-08-16 56 views
6

Bir android.support.v7.preference.ListPreference iletişim kutusu açmak, bir seçenek belirlemek, NavDrawer'ı açmak ve çekmeceden bir öğe seçmek için gereken bir sınava sahibim.Android Espresso, kullanıcı arayüzü için beklemiyor

iletişim böyle tanımlanır:

<android.support.v7.preference.ListPreference 
    android:defaultValue="@string/pref_default_VALUE" 
    android:entries="@array/pref_VALUE_entries" 
    android:entryValues="@array/pref_VALUE_values" 
    android:key="@string/pref_key_VALUE" 
    android:negativeButtonText="@null" 
    android:positiveButtonText="@null" 
    android:title="@string/pref_title_VALUE" /> 

Espresso şöyle açar:

onView(withText(mActivityRule.getActivity().getResources().getString(R.string.pref_title_VALUE)) 
    .perform(click()); 

Bu ListPreference açmak yok, ama engellemez ve testte sonraki satır hemen çalışır.

// click on setting 
    onView(withText(VALUE_IN_LIST_PREFERENCE)) 
      .perform(click()); 

o hemen gerçekleşir yana

iletişim görünmeyen ve withText (VALUE_IN_LIST_PREFERENCE) hiçbir şey eşleşir.

Yukarıdaki satırda duraklatarak bir hata ayıklayıcısını kullanarak adım adım atarsam, iletişim kutusu zaman içinde görünür ve kod çalışır.

Aynı sorun, daha sonra nav çekmecesinde gerçekleşir. Böyle açtı:

// open the nav drawer 
    onView(withId(R.id.drawer_layout)) 
      .perform(DrawerActions.open()); 

Ve bir öğe tıklandığında: ListPreferences olduğu gibi

// click on phase 1 
    onView(withId(R.id.nav_view)) 
      .perform(NavigationViewActions.navigateTo(R.id.nav_ITEM)); 

test kodu kullanıcı arayüzü bitirmek ve böylece OnView çağrısı başarısız beklemeden devam eder. Konu uyku yapılan ve görünümü testi hemen çalıştırır kadar uyumaya Konu koyarak ve her iki durumda da burada https://stackoverflow.com/a/22563297/4950621

cevabını aşağıdaki denedi

Ancak iletişim görünmüyor. Yani, sorun sadece ertelendi, çözülmedi.

Espresso testlerinin gerekli Görünümler görünene kadar çalışmadığından nasıl emin olabilirim?

cevap

0

Henüz bir çözüm bulamadıysanız, burada sağlanan size yardımcı olabilir.

Wait until view become visible with IdleResource

çözüm en kısa sürede her şey boşta hale gelmez olarak çalıştırılacak bir geri arama sağlamak sağlayacak IdlingResource, uygulamaktır.

@Override 
public final boolean isIdleNow() { 
    mIdle = mIdle || mView.getVisibility() == mExpectedVisibility; 

    if (mIdle) { 
     if (mResourceCallback != null) { 
      mResourceCallback.onTransitionToIdle(); 
     } 
    } 

    return mIdle; 
}