Фрагментное тестирование, мне не хватает чего-то эквивалентного 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()