2015-11-03 17 views
12

Meine App lädt Daten neu, wenn ein Down-Swipe auf einer SwipeRefreshLayout ausgeführt wird. Jetzt versuche ich, dies zu testen, mit Android-Testkit/Espresso wie folgt aus:Espresso: Wie SwipeRefreshLayout testen?

onView(withId(R.id.my_refresh_layout)).perform(swipeDown()); 

Leider ist dieser mit

android.support.test.espresso.PerformException: Error performing 'fast swipe' 
on view 'with id: my.app.package:id/my_refresh_layout'. 
... 
Caused by: java.lang.RuntimeException: Action will not be performed because the target view 
does not match one or more of the following constraints: 
at least 90 percent of the view's area is displayed to the user. 
Target view: "SwipeRefreshLayout{id=2131689751, res-name=my_refresh_layout, visibility=VISIBLE, 
width=480, height=672, has-focus=false, has-focusable=true, has-window-focus=true, 
is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, 
is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, 
child-count=2}" 

Natürlich scheitert, ist das Layout sichtbar und manuell arbeitet klauen, aber ich bin nicht sicher wenn ich etwas falsch mache? Das Layout erstreckt sich über den gesamten Bildschirm, so dass es wirklich möglich sein sollte, damit Espresso etwas dagegen tun kann.

Antwort

30

Schlafen über es hilft manchmal. Der Grund dafür war, dass die zu sendende Ansicht für den Benutzer nur zu 89% sichtbar war, während die Wischaktionen von Espresso intern 90% verlangten. So ist die Lösung, die Swipe-Aktion in eine andere Aktion zu wickeln und diese Beschränkungen von Hand außer Kraft setzen, wie folgt aus:

onView(withId(R.id.my_refresh_layout)) 
    .perform(withCustomConstraints(swipeDown(), isDisplayingAtLeast(85)); 
:

public static ViewAction withCustomConstraints(final ViewAction action, final Matcher<View> constraints) { 
    return new ViewAction() { 
     @Override 
     public Matcher<View> getConstraints() { 
      return constraints; 
     } 

     @Override 
     public String getDescription() { 
      return action.getDescription(); 
     } 

     @Override 
     public void perform(UiController uiController, View view) { 
      action.perform(uiController, view); 
     } 
    }; 
} 

Dies kann dann wie folgt aufgerufen werden

Verwandte Themen