2016-02-03 2 views
11

рабочего процесса, должны быть следующие:Testing прогресс бар на Android с Espresso

  1. активность начинается
  2. Прогресс бар видна
  3. запрос сети пожаров (на холостом ходу ресурс уже зарегистрирован поэтому эспрессо умеет ждать для этого).
  4. Индикатор прогресса скрыт
  5. Отображен текст из сети.

До этого момента, я написал утверждения для шагов 1, 3, 5 и она прекрасно работает:

onView(withText("foo 1")) 
    .check(matches(isDisplayed())); 

Проблема, я понятия не имею, как позволить эспрессо знать, чтобы проверить видимость индикатора выполнения до запрос сделан и после запрос сделан.

Рассмотрим метод onCreate() заключается в следующем:

super.onCreate(...); 
setContentView(...); 

showProgressBar(true); 
apiClient.getStuff(new Callback() { 
    public void onSuccess() { 
     showProgressBar(false); 
    } 
}); 

Я попытался следующие, но это не работает:

// Activity is launched at this point. 
activityRule.launchActivity(new Intent()); 

// Up to this point, the request has been fired and response was 
// returned, so the progress bar is now GONE. 
onView(withId(R.id.progress_bar)) 
    .check(matches(isDisplayed())); 

onView(withId(R.id.progress_bar)) 
    .check(matches(not(isDisplayed()))); 

Причина это происходит потому, что, так как клиент зарегистрированный как ресурс холостого хода, эспрессо будет ждать до тех пор, пока он не будет idle еще раз перед запуском первого onView(...progressbar...)..., поэтому мне нужно, чтобы эспрессо знал, что нужно запустить этот ПЕРЕД собирается простаивать.

EDIT: это не работает либо:

idlingResource.registerIdleTransitionCallback(new IdlingResource.ResourceCallback() { 
     @Override 
     public void onTransitionToIdle() { 
      onView(withId(R.id.progress_bar)) 
        .check(matches(isDisplayed())); 
     } 
    }); 
+0

Ну ты вам нужно будет проверить свою активность. Если вы хотите придерживаться текущих интеграционных тестов, вам нужно будет высмеять/закрыть ваши вызовы api. –

+0

. Api уже закодирован и зарегистрирован как ресурс бездействия. Я не об этом спрашиваю. –

ответ

4

Похоже, что это не может быть действительно возможно. Хотя это более старая публикация групп, в Android Test Kit Discussion есть довольно решающий ответ, где указано, что потоки пользовательского интерфейса не покоятся во время анимации индикаторов выполнения, и поэтому среда Espresso не может выполняться.

Marcus Klepp рекомендует пройти мимо этого here с использованием типов сборки. Плагин Gradle позволит вам определить разные build types. Вы можете настроить другой макет в свой тип сборки androidTest, который заменяет View на что-то общее. Если все, что вы делаете, подтверждает, что виджет isDisplayed() при одном наборе условий и not(isDisplayed()) под другим набором условий, то вы, несомненно, можете реализовать это через разные файлы макета. Не то, чтобы это не было немного лифта.

Наконец, может быть еще один пост здесь, который несет некоторую дополнительную информацию здесь: "java.lang.RuntimeException: Could not launch intent" for UI with indeterminate ProgressBar

11

Эспрессо имеет проблемы с анимацией. Вы можете просто установить для рисования индикатора выполнения что-то статическое только для теста, и оно работает так, как ожидалось.

Drawable notAnimatedDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.whatever); 
((ProgressBar) getActivity().findViewById(R.id.progress_bar)).setIndeterminateDrawable(notAnimatedDrawable); 

onView(withId(R.id.progress_bar)).check(matches(isDisplayed())); 
+0

Хороший собачий гвоздь :-) –

+0

Вы можете отключить анимацию в настройках -> Параметры разработчика -> Масштаб анимации Windows/Масштаб анимации перехода/масштаб анимации аниматора – heloisasim

+0

@heloisasim не помогает к сожалению –

2

Как я могу видеть Espresso тесно связан с вприпрыжку динамические действия UI вообще, поэтому вы не можете проверить ProgressBar с помощью Espresso. Тем не менее, вы можете легко сделать это с помощью другого инструмента Android Google: UiAutomator следующим образом:

saveButton().click(); // perform action opening ProgressBar with UiAutomator, not Espresso 
    assertTrue(progressBar().exists()); 

Используя эти статические утилиты:

public static UiObject progressBar() { 
    return uiObjectWithText(R.string.my_progress); 
} 

public static UiObject saveButton() { 
    return uiObjectWithId(R.id.my_save_button); 
} 

public static UiObject uiObjectWithId(@IdRes int id) { 
    String resourceId = getTargetContext().getResources().getResourceName(id); 
    UiSelector selector = new UiSelector().resourceId(resourceId); 
    return UiDevice.getInstance(getInstrumentation()).findObject(selector); 
} 

public static UiObject uiObjectWithText(@StringRes int stringRes) { 
    UiSelector selector = new UiSelector().text(getTargetContext().getString(stringRes)); 
    return UiDevice.getInstance(getInstrumentation()).findObject(selector); 
} 

Убедитесь, что build.gradle включает в себя:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 
+0

Спасибо, это было единственное решение что сработало :-) –

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