Expresso - Afirmar um TextView com async carregado de dados
-
20-12-2019 - |
Pergunta
Eu estou escrevendo um teste de INTERFACE do usuário com o Google Expresso para Android e eu estou preso sobre como declarar um TextView texto, cujo conteúdo é de forma assíncrona carregado a partir de um serviço web.Meu código é:
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();
}
}
Em (1), informar minha atividade de carga de um elemento a partir do webservice.Em (2), eu estou esperando a opinião de afirmar o seu conteúdo.Esta é a parte que o teste falhar, porque é executado antes de o webservice respostas o aplicativo.
Como eu posso dizer de café Expresso para esperar por uma determinada peça de dados que aparecem no ecrã?Ou devo pensar em uma maneira diferente de escrever esse teste?
Solução
Você pode lidar com esse caso, registando um IdlingResource para o serviço da web com café Expresso.Dê uma olhada no que este write-up: https://developer.android.com/training/testing/espresso/idling-resource.html
Provavelmente, você vai querer usar CountingIdlingResource (que usa um simples contador para controlar quando algo está ocioso).Este exemplo de teste de demonstra como isso pode ser feito.
Outras dicas
Se você não está incomodado com o uso de UiAutomator com Espresso, você poderia fazer algo assim na etapa 4.
UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);