Android Espresso: как протестировать определенный фрагмент при выполнении одного действия для архитектуры нескольких фрагментов

мое приложение состоит из одного Activity много Fragments.

Я хочу использовать эспрессо для тестирования пользовательского интерфейса Fragments. Однако я столкнулся с проблемой.

как я могу проверить Fragment, который не добавляется к Activity на onCreate. Все примеры, которые я видел с Fragments вовлечение Fragment добавить onCreate. Итак, как я могу сказать эспрессо, чтобы перейти к определенному Fragment и начать оттуда?

спасибо

2 ответов


Эспрессо тест Fragments только если они отображаются. И это требует, чтобы они отображались Activity.

С вашей текущей настройкой вам придется использовать эспрессо для click() ваш путь (как пользователь) с Fragment вы действительно хотите проверить.

в одном из моих проектов у меня есть ViewPager это показывает Fragments. Для тех Fragments Я использую пользовательский FragmentTestRule чтобы проверить их в изоляции. Я могу начать каждый Fragment сразу и используйте эспрессо Для того чтобы испытать его. Видеть ответ.

вы также можете:

  • не используйте Fragments. Activities легче тестировать. Вы можете проверить каждый Activity самостоятельно. В большинстве случаев Fragments не предлагают никакого преимущества над Activities. Fragments просто сделайте реализацию и тестирование более сложными.
  • включить FragmentActivity чтобы непосредственно показать определенный Fragment когда он будет создан. Е. Г. путем предоставления специального намерения, дополнительную к вашей FragmentActivity. Но это добавит тестовый код для вашего приложения, которое, как правило, не является хорошим решением.

просто покажите фрагмент, используя SupportFragmentManager действия.

например (Котлин) с ActivityTestRule:

@Rule
@JvmField
var activityRule = ActivityTestRule(MainActivity::class.java)

просто сделайте это перед тестами:

@Before
fun setup() {
    activityRule.activity.supportFragmentManager.beginTransaction().replace(R.id.main_activity_container_for_your_fragments, FragmentToShow(), "fragment-tag").commitAllowingStateLoss()
    Thread.sleep(500)
}