Espresso - Asserting una prova con i dati caricati Async
-
20-12-2019 - |
Domanda
Sto scrivendo un test dell'interfaccia utente con Google Espresso per Android e sono bloccato su come avvistare un testo TextVisualizza, il quale il contenuto è caricato asincrono da un servizio Web.Il mio codice corrente è:
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), informo la mia attività per caricare un elemento dal servizio web.Su (2), sto aspettando la vista che assisterà il suo contenuto.Questa è la parte che il test fallisce, perché esegue prima che il WebService risponda all'app.
Come posso dire a Espresso di attendere un particolare pezzo di dati sullo schermo?O dovrei pensare in un modo diverso per scrivere tale test?
Soluzione
È possibile gestire questo caso registrando un IDLINGRESOURCE per il tuo servizio Web con Espresso.Dai un'occhiata a questa scrittura: https://developer.android.com / formazione / test / espresso / inattivo-risorsa.html
Molto probabilmente, vorrai usare conteggioDlingResource (che utilizza un semplice contatore da tracciare quando qualcosa è inattivo).Questo Test del campione Dimostra come questo può essere fatto.
Altri suggerimenti
Se non sei preoccupato di usare Uiautomator con espresso, potresti fare qualcosa del genere nel tuo passaggio 4.
UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);
.