【问题标题】:FragmentController vs FragmentScenarioFragmentController vs FragmentScenario
【发布时间】:2020-03-12 18:51:07
【问题描述】:

Roblectric 的 FragmentController 允许我们将 Fragment 的生命周期驱动到所需的状态。似乎FragmentScenario 总是将被测试的Fragment 带到其恢复状态。有人会假设调用moveToState(CREATED) 会将Fragment 带回它的onCreate(),但实际上,根据docsmoveToState() 模拟了与被测Fragment 交互的外部应用程序。这意味着moveToState(CREATED) 将测试中的Fragment 移动到onPause()onStop(),就像启动新的Activity 时一样。

要将片段驱动到不同的生命周期状态,请调用 moveToState()。此方法支持以下状态作为参数:CREATED、STARTED、RESUMED 和 DESTROYED。此操作模拟包含您的 Fragment 的 Activity 更改其状态的情况,因为它被另一个应用程序或系统操作中断。

是否有可能以某种方式指示FragmentScenarioFragment 驱动到所需状态,而不是总是通过onResume()?我们如何使用FragmentScenario 测试onCreate() 内部发生的事情,而不是onResume() 内部发生的事情?我在这里遗漏了什么吗?

【问题讨论】:

标签: android android-espresso robolectric android-fragmentscenario


【解决方案1】:

不知道为什么你需要在片段的 onCreate 期间测试某些东西,但我有案例为我的片段提供假视图模型(模拟快乐案例等) - 你可以这样做:

@Test fun yetAnotherTest(){

    val fakeViewModel = YourViewModel(fakeDependency1, fakeDependency2,...)

    val scenario: FragmentScenario<YourFragment> =
        launchFragmentInContainer {
            YourFragment().apply {
                viewModel = fakeViewModel
            }
        }
}

还有一些小改动

lateinit var viewmodel: YourViewModel

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    //if this is yetAnotherTest() run, line is skipped 
    if (!::viewModel.isInitialized) {
        //normal setup
        viewModel = provideYourViewModel()
    }

或者,您可以为您的片段提供FragmentFactory,这样您就可以更轻松地使用 FragmentScenario 测试片段。

【讨论】:

  • 这需要修改生产代码以适应测试,并且您仍然不知道何时与视图模型交互。我找到了一个不需要这样做的解决方案,但是在与 Android 测试团队的某人联系 discussion 之后,似乎这种“限制”是故意的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多