Espresso - affirmation d'une vue textuelle avec des données chargées ASYNC
-
20-12-2019 - |
Question
J'écris un test d'interface utilisateur avec Google Espresso pour Android et je suis bloqué sur la manière d'affirmer un texte TextView, quel contenu est chargé d'une manière asynchrone à partir d'un service Web.Mon code actuel est:
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();
}
}
sur (1), j'informe mon activité pour charger un élément du site Web.Sur (2), j'attends la vue affirmant son contenu.C'est la partie que le test échoue, car il s'exécute avant que le WebService réponde à l'application.
Comment puis-je dire à l'espresso d'attendre qu'un morceau particulier de données apparaisse à l'écran?Ou devrais-je penser d'une manière différente d'écrire un tel test?
La solution
Vous pouvez gérer ce cas en enregistrant une sortie idlingresource pour votre service Web avec expresso.Jetez un coup d'œil à cette huisson: https://developer.android.com / formation / test / expresso / ralenti-ressource.html
Très probablement, vous voudrez utiliser CountingIDLingResource (qui utilise un compteur simple pour suivre quand quelque chose est inactif).Ceci Test d'échantillon montre comment cela peut être fait.
Autres conseils
Si vous n'êtes pas dérangé par l'utilisation de uautomator avec expresso, vous pouvez faire quelque chose comme ceci dans votre étape 4.
UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);