Эспрессо — утверждение TextView с асинхронно загруженными данными

Я пишу тест пользовательского интерфейса с Google Espresso для Android, и я застрял в том, как утвердить текст 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();
    }
}

В (1) я сообщаю о своей активности для загрузки элемента из веб-сервиса. На (2) я жду представления, подтверждающего его содержание. Это та часть, в которой тест не проходит, потому что он выполняется до того, как веб-сервис ответит приложению.

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


person Bolhoso    schedule 08.01.2014    source источник
comment
попробуйте этот подход - stackoverflow.com/a/22563297/349681, возможно, вы можете использовать отрицательный сопоставитель и подождать, пока не начнется просмотр прочь.   -  person Oleksandr Kucherenko    schedule 07.04.2014


Ответы (2)


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

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

person ValeraZakharov    schedule 08.01.2014
comment
Потрясающий! Завтра обязательно попробую. В документах говорится, что Espresso привязывается к пулу потоков AsyncTask. Это делается с помощью AsyncTaskPoolMonitor? Есть ли что-нибудь готовое для пула потоков Volley? - person Bolhoso; 09.01.2014
comment
Пока ничего для Волей. Было бы здорово, если бы кто-то из сообщества открытого исходного кода внес свой вклад. Об этом было обсуждение: groups.google.com/forum/#!searchin/android-test-kit-discuss/ - person ValeraZakharov; 09.01.2014

Если вас не беспокоит использование UiAutomator с Espresso, вы можете сделать что-то подобное на шаге 4.

UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);

https://developer.android.com/reference/android/support/test/uiautomator/UiObject.html#waitForExists(long)

person aestheticfish    schedule 18.09.2017