【问题标题】:FragmentController vs FragmentScenarioFragmentController vs FragmentScenario
【发布时间】:2020-03-12 18:51:07
【问题描述】:
Roblectric 的 FragmentController 允许我们将 Fragment 的生命周期驱动到所需的状态。似乎FragmentScenario 总是将被测试的Fragment 带到其恢复状态。有人会假设调用moveToState(CREATED) 会将Fragment 带回它的onCreate(),但实际上,根据docs,moveToState() 模拟了与被测Fragment 交互的外部应用程序。这意味着moveToState(CREATED) 将测试中的Fragment 移动到onPause() 和onStop(),就像启动新的Activity 时一样。
要将片段驱动到不同的生命周期状态,请调用 moveToState()。此方法支持以下状态作为参数:CREATED、STARTED、RESUMED 和 DESTROYED。此操作模拟包含您的 Fragment 的 Activity 更改其状态的情况,因为它被另一个应用程序或系统操作中断。
是否有可能以某种方式指示FragmentScenario 将Fragment 驱动到所需状态,而不是总是通过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 之后,似乎这种“限制”是故意的。