1

我习惯于通过在 Espresso 测试中启动包含它的 Activity 来测试我的 Fragments。这一直工作得很好,我已经能够通过添加到 ActivityScenarioRule(或 IntentsTestRule)的一些测试规则(例如 OkHttpIdlingResourceRule)来控制测试环境/执行,然后用于启动 Activity。

现在我正在转向单一活动方法并利用导航组件,我想开始单独测试我的片段。但是,为了能够做到这一点,我需要在片段测试中具有与 Activity 测试中类似的功能。ActivityScenarioRule 实现了 TestRule,但 FragmentScenario 没有实现,并且没有 FragmentScenarioRule。

我错过了什么吗?

4

1 回答 1

0

其实很简单。在测试活动时,我有一个包含以下内容的基础测试类:

@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
}

在测试中,使用 launchFragmentInContainer() 启动 Fragment

于 2020-08-27T10:50:31.387 回答