2015-06-25 6 views
11

Пытается провести несколько тестов с помощью ViewPager.Ждите просмотра анимации пейджера с эспрессо?

Я хочу провести между вкладками, и я не хочу продолжать, пока салфетка не будет завершена. Но, похоже, нет способа отключить анимацию для пейджера представления (все анимации в настройках разработчика отключены).

Так что это всегда приводит к непрохождения теста, поскольку вид пейджера не завершил это анимация, и поэтому вид еще не полностью отображается:

// 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())); 

Есть элегантный или, может быть, даже рекомендуемый способ чтобы сделать это, или я застрял в том, чтобы там было какое-то приуроченное ожидание?

ответ

21

IdlingResource @Simas предлагает на самом деле довольно просто реализовать:

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

Я прав, думая, что мне нужно только зарегистрировать ViewPagerIdlingResource один раз за тест. Поэтому я регистрирую VPIR в начале теста, затем onView() выполняет (swipeLeft), затем снова inView() выполняет (swipeLeft), затем проверяет свое представление. Мне не нужно отменить регистрацию и зарегистрировать мой VPIR между двумя щелчками? – flobacca

+1

@flobacca Да, это так. – vaughandroid

-3

Вы можете сделать много работы и использовать IdlingResource реализовать OnPageChangeListener

или просто:

SystemClock.sleep(500); 
+0

Сон - это то, чего я действительно хотел бы избежать. – Mark

+2

Спящая анимация - это очень непостижимая практика. Также он загромождает тестовый код, так как он может быстро состоять из 50% заявлений сна. Вы действительно должны пойти на решение ресурса на холостом ходу, которое вытаскивает ожидания в ожидании от вашей логики тестового кода. –

+0

Это также может привести к несовместимым, неровным испытаниям, потому что для разных систем или итераций теста требуется больше/меньше времени ожидания. Он также может медленно начать добавлять значительное количество времени в тестовый пакет. –

0

Попробуйте это,

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

Просто представив пользовательский салфетки и заменив 'Swipe.FAST' на' Swipe.SLOW', возможно, не будет исправлена ​​основная проблема, и я уже пробовал это! Лучший способ - создать пользовательский 'IdlingResource', как это предлагается в [ответе выше] (http://stackoverflow.com/a/32763454/1016544). –