Espresso: afirmar una vista de texto con datos cargados de ASYNC
-
20-12-2019 - |
Pregunta
Estoy escribiendo una prueba de UI con Google Espresso para Android y estoy atascado en cómo afirmar un texto de texto, que el contenido se carga de forma asíncrona de un servicio web.Mi código actual es:
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();
}
}
en (1), le informe a mi actividad para cargar un elemento del servicio web.En (2), estoy esperando la vista afirmando su contenido.Esta es la parte que falla la prueba, porque se ejecuta antes de que el servicio web responda a la aplicación.
¿Cómo puedo decirle a Espresso que espere que aparezcan una pieza de datos en particular en la pantalla?¿O debería pensar de manera diferente a escribir dicha prueba?
Solución
Puede manejar este caso registrando un IdlingReSource para su servicio web con Espresso.Eche un vistazo a este escrito: https://developer.android.com / Formación / Pruebas / Espresso / iDling-Resource.HTML
más probable, querrá usar contingingidlingresource (que utiliza un contador simple para rastrear cuando algo está inactivo).Esta prueba de muestra demuestra cómo se puede hacer esto.
Otros consejos
Si no está molestado con el uso de Uiautomator con el espresso, podría hacer algo como esto en su paso 4.
UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);