2015-06-25 33 views
11

Bazı Testleri bir ViewPager ile yapmaya çalışın.Espresso ile çağrı cihazı animasyonlarını görmeyi bekleyin.

Ben sekmeler arasında tokatlamak istiyorum ve kaydırma tamamlanana kadar ben devam etmek istemiyorum. Ancak, görüntülü çağrı cihazı için animasyonu kapatmak için bir yol görünmüyor (geliştirici seçeneklerinin altındaki tüm animasyonlar devre dışıdır).

// swipe left 
onView(withId(R.id.viewpager)).check(matches(isDisplayed())).perform(swipeLeft()); 

// check to ensure that the next tab is completely visible. 
onView(withId(R.id.next_tab)).check(matches(isCompletelyDisplayed())); 

zarif ya da belki önerilen yolu var mı: görünüm çağrı cihazı animasyon var tamamlamamıştır ve böylece görünümü tamamen henüz gösterilmemiş olduğundan

Yani bu her zaman bir test başarısızlıkla sonuçlanır Bunu yapmak için, ya da orada bir süre beklemek beklemek zorunda kaldım mı?

Sen bir sürü iş yapmak ve bir OnPageChangeListener

veya basitçe uygulamak için bir IdlingResource kullanabilirsiniz ya

cevap

21

uygulamak aslında oldukça basittir:

public class ViewPagerIdlingResource implements IdlingResource { 

    private final String mName; 

    private boolean mIdle = true; // Default to idle since we can't query the scroll state. 

    private ResourceCallback mResourceCallback; 

    public ViewPagerIdlingResource(ViewPager viewPager, String name) { 
     viewPager.addOnPageChangeListener(new ViewPagerListener()); 
     mName = name; 
    } 

    @Override 
    public String getName() { 
     return mName; 
    } 

    @Override 
    public boolean isIdleNow() { 
     return mIdle; 
    } 

    @Override 
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { 
     mResourceCallback = resourceCallback; 
    } 

    private class ViewPagerListener extends ViewPager.SimpleOnPageChangeListener { 

     @Override 
     public void onPageScrollStateChanged(int state) { 
      mIdle = (state == ViewPager.SCROLL_STATE_IDLE 
        // Treat dragging as idle, or Espresso will block itself when swiping. 
        || state == ViewPager.SCROLL_STATE_DRAGGING); 
      if (mIdle && mResourceCallback != null) { 
       mResourceCallback.onTransitionToIdle(); 
      } 
     } 
    } 
} 
+2

Düşüncesinde haklıyım, sadece ViewPagerIdlingResource'ı test başına bir kez kaydetmem gerekiyor. Bu yüzden testin başında VPIR'ı, sonra ViewView() işlemini gerçekleştirin (swipeLeft), sonra tekrar ViewView() gerçekleştirin (swipeLeft), sonra görüşümü kontrol ediyorum. VPIR'imi iki swipe doğru kaydetmem ve kaydetmem gerekmiyor mu? – flobacca

+1

@flobacca Evet, doğru. – vaughandroid

-3

: IdlingResource @Simas anlaşılacağı

SystemClock.sleep(500); 
+0

Uyku gerçekten kaçınmak istediğim şeydir. – Mark

+2

Uyku animasyonu süreleri çok sürdürülemez bir uygulamadır. Ayrıca, hızlı bir şekilde% 50 uyku ifadelerinden oluşabileceğinden, test kodunu karıştırır. Test kodu mantığınızdan boşta bekleyen rölanti kaynak çözümüne gitmelisiniz. –

+0

Ayrıca, tutarsız, kesikli testlerle sonuçlanabilir, çünkü farklı sistemler veya testin yinelemeleri beklemek için daha az zamana ihtiyaç duyar. Ayrıca, test paketinize önemli bir süre yavaş yavaş eklemeye başlayabilir. –

0

bu deneyin ,

onView(withId(R.id.pager)).perform(pagerSwipeRight()).perform(pagerSwipeLeft()); 

    private GeneralSwipeAction pagerSwipeRight(){ 
     return new GeneralSwipeAction(Swipe.SLOW, GeneralLocation.CENTER_LEFT, 
       GeneralLocation.CENTER_RIGHT, Press.FINGER); 
    } 

    private GeneralSwipeAction pagerSwipeLeft(){ 
     return new GeneralSwipeAction(Swipe.SLOW, GeneralLocation.CENTER_RIGHT, 
       GeneralLocation.CENTER_LEFT, Press.FINGER); 
    } 
+0

Sadece özel bir tokatla tanıtmak ve 'Swipe.SLOW' ile' Swipe.FAST 'ifadesini değiştirmek temel sorunu çözmeyebilir ve bunu zaten denedim! Daha iyi bir yol, [yukarıdaki cevapta] (http://stackoverflow.com/a/32763454/1016544) önerildiği gibi bir Özel 'IdlingResource 'oluşturmak olacaktır. –