【问题标题】:Fragment testing, I'm missing something equivalent to ActivityScenarioRule片段测试,我缺少与 ActivityScenarioRule 等效的东西
【发布时间】:2020-08-25 08:29:31
【问题描述】:
我习惯于通过在 Espresso 测试中启动包含片段的 Activity 来测试片段。这一直工作得很好,我已经能够通过添加到 ActivityScenarioRule(或 IntentsTestRule)的一些测试规则(例如 OkHttpIdlingResourceRule)来控制测试环境/执行,然后用于启动 Activity。
现在我正在转向单一 Activity 方法并利用导航组件,我想开始单独测试我的片段。但是,为了能够做到这一点,我需要在片段测试中具有与 Activity 测试中类似的功能。 ActivityScenarioRule 实现了 TestRule,但 FragmentScenario 没有实现,也没有 FragmentScenarioRule。
我错过了什么吗?
【问题讨论】:
标签:
android-testing
android-jetpack-navigation
android-fragmentscenario
【解决方案1】:
其实很简单。在测试活动时,我有一个包含以下内容的基础测试类:
@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) 启动
现在,当测试 Fragments 时,这变成了:
@Rule
@JvmField
val chain: RuleChain
init {
var initChain = RuleChain.outerRule(firstRule)
.around(OkHttpIdlingResourceRule())
for (rule in additionalTestRules) {
initChain = initChain.around(rule)
}
chain = initChain
}
在测试中,Fragment 使用 launchFragmentInContainer() 启动