Фрагментное тестирование, мне не хватает чего-то эквивалентного ActivityScenarioRule

Я привык тестировать свои фрагменты, запуская действие, содержащее его, в тесте эспрессо. Это работает довольно хорошо, и я смог контролировать тестовую среду / выполнение с помощью некоторых правил тестирования (например, OkHttpIdlingResourceRule), которые добавляются в ActivityScenarioRule (или IntentsTestRule), который затем используется для запуска Activity.

Теперь, когда я перехожу к единому подходу Activity и использую также компонент Navigation, я хотел бы начать тестирование своих фрагментов изолированно. Однако, чтобы сделать это, мне потребуются аналогичные возможности для тестирования фрагментов, которые существуют в тестировании активности. ActivityScenarioRule реализует TestRule, а FragmentScenario - нет, а FragmentScenarioRule отсутствует.

Я что-то упускаю?

1 ответ

Решение

На самом деле это довольно просто. При тестировании Activity у меня был базовый тестовый класс, содержащий следующее:

@Rule @JvmField
val activityRule: IntentsTestRule<*>

@Rule @JvmField
val chain: RuleChain

init {
    activityRule = IntentsTestRule(
            activityClass,
            true, // true if the Activity should be placed into "touch mode" when started
            false) // launchActivity

    var initChain = RuleChain.outerRule(firstRule)
            .around(OkHttpIdlingResourceRule())
            .around(activityRule) 

    for (rule in additionalTestRules) {
        initChain = initChain.around(rule)
    }

    chain = initChain
}

В тесте Activity запускается с activityRule.launchActivity(null). И теперь при тестировании фрагментов это становится:

@Rule
@JvmField
val chain: RuleChain

init {
    var initChain = RuleChain.outerRule(firstRule)
            .around(OkHttpIdlingResourceRule())

    for (rule in additionalTestRules) {
        initChain = initChain.around(rule)
    }

    chain = initChain
}

В тесте Фрагмент запускается с помощью launchFragmentInContainer()

Другие вопросы по тегам