【问题标题】: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() 启动

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多