2014-01-08 2 views
14

Я пишу UI-тест с Google Espresso для Android, и я зациклился на том, как утверждать текст TextView, содержимое которого асинхронно загружается из веб-службы. Мой текущий код:Эспрессо - утверждение TextView с данными с асинхронными данными

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), сообщаю свою деятельность, чтобы загрузить элемент из веб-сервиса. На (2) я жду представления, утверждающего его содержимое. Это та часть, которую тест терпит неудачу, потому что он выполняется до того, как веб-служба ответит на приложение.

Как я могу сказать Espresso, чтобы ждать, пока на экране появится определенная часть данных? Или я должен думать иначе, чтобы написать такой тест?

+0

попробовать этот подход - http://stackoverflow.com/ a/22563297/349681, потенциально вы можете использовать отрицательный сокет и ждать, пока вид не исчезнет. –

ответ

17

Вы можете обработать этот случай, зарегистрировав IdlingResource для своего веб-сервиса с помощью Espresso. Взгляните на эту рецензию: https://developer.android.com/training/testing/espresso/idling-resource.html

Скорее всего, вы захотите использовать CountingIdlingResource (который использует простой счетчик для отслеживания, когда что-то простаивает). Это sample test демонстрирует, как это можно сделать.

+1

Удивительный! Я обязательно попробую завтра. Документы говорят, что Espresso привязывается к пулу потоков AsyncTask. Это делается AsyncTaskPoolMonitor? Есть ли что-нибудь из коробки для пула потоков волейбола? – Bolhoso

+0

Ничего для Волейбола. Было бы здорово, если бы кто-то из сообщества с открытым исходным кодом внес бы свой вклад в это. Об этом было несколько: https://groups.google.com/forum/#!searchin/android-test-kit-discuss/Volley/android-test-kit-discuss/RBzGo5nDgwI/bKCwZLkviSUJ – ValeraZakharov

Смежные вопросы