问题描述
我习惯于通过在Espresso测试中启动包含它的Activity来测试我的片段。这已经很好地工作了,我已经能够通过添加到ActivityScenarioRule(或IntentsTestRule)中的一些测试规则(例如OkHttpIdlingResourceRule)来控制测试环境/执行,然后将其用于启动Activity。
现在,我正在朝着单一活动方法发展,并且还使用导航组件,我想开始隔离测试我的片段。但是,要做到这一点,我将需要与活动测试中存在的片段测试类似的功能。 ActivityScenarioRule实现TestRule,但FragmentScenario不实现,并且也不是FragmentScenarioRule。
我想念什么吗?
解决方法
实际上非常简单。在测试活动时,我有一个包含以下内容的基本测试类:
@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
}
在测试中,活动是使用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
}
在测试中,片段通过launchFragmentInContainer()启动