2014-01-08 2 views
14

Ich schreibe einen UI-Test mit Google Espresso für Android und ich bin fest, wie man einen TextView-Text, der asynchron von einem Web-Service geladen wird behaupten. Mein aktueller Code ist:Espresso - Assert eine TextView mit async geladenen Daten

public class MyTest extends BaseTestCase<MyActivity>{ 
    public void setUp() throws Exception { 
     // (1) Tell the activity to load 'element-to-be-loaded' from webservice 
     this.setActivityIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("data://data/element-to-be-loaded"))); 
     getActivity(); 

     super.setUp(); 
    } 

    public void testClickOnReviews(){ 
     // (2) Check the element is loaded and its name is displayed 
     Espresso 
      .onView(ViewMatchers.withId(R.id.element_name)) 
      .check(ViewAssertions.matches(ViewMatchers.withText("My Name"))); 

     // (3) Click on the details box 
     Espresso 
      .onView(ViewMatchers.withId(R.id.details_box)) 
      .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) 
      .perform(ViewActions.click()); 

     // (4) Wait for the details screen to open 
     Espresso 
      .onView(ViewMatchers.withId(R.id.review_box)); 

     // Go back to element screen 
     Espresso.pressBack(); 
    } 
} 

On (1), informiere ich meine Tätigkeit ein Element aus dem Webservice zu laden. An (2) warte ich auf die Ansicht, die ihren Inhalt bestätigt. Dies ist der Teil, bei dem der Test fehlschlägt, da er ausgeführt wird, bevor der Webservice die App beantwortet.

Wie kann ich Espresso darauf warten, dass bestimmte Daten auf dem Bildschirm angezeigt werden? Oder sollte ich anders denken, um einen solchen Test zu schreiben?

+0

versuchen, diesen Ansatz zu tun - http://stackoverflow.com/ a/22563297/349681, möglicherweise können Sie negative Matcher verwenden und warten, bis die Ansicht verschwindet. –

Antwort

17

Sie können diesen Fall behandeln, indem Sie eine IdlingResource für Ihren Webservice mit Espresso registrieren. Werfen Sie einen Blick auf diese Zuschreibung auf: https://developer.android.com/training/testing/espresso/idling-resource.html

Höchstwahrscheinlich werden Sie CountingIdlingResource verwenden möchten (die einen einfachen Zähler verwendet, um zu verfolgen, wenn etwas ist im Leerlauf). Diese sample test zeigt, wie dies getan werden kann.

+1

Super! Ich werde es auf jeden Fall morgen versuchen. Die Dokumentation besagt, dass Espresso an den AsyncTask-Thread-Pool bindet. Ist es von AsyncTaskPoolMonitor getan? Gibt es für den Volley-Thread-Pool einen Out-of-the-Box? – Bolhoso

+0

Nichts für Volley, noch. Es wäre toll, wenn jemand aus der Open-Source-Community dazu beitragen würde. Es gab einige Diskussionen darüber: https://groups.google.com/forum/#!searchin/android-test-kit-discuss/Volley/android-test-kit-discuss/RBzGo5nDgwI/bKCwZLkviSUJ – ValeraZakharov