小编Luk*_*uke的帖子

使用 Espresso 通过 NavGraphViewModel 测试 Viewpager

我目前有一个使用“一个活动-多个片段”方法的应用程序,并且在该应用程序中是一个与其子级共享重要数据的片段,因此我使用了 navGraphViewModels 范围为嵌套导航图,如下所示:

private val viewModel by navGraphViewModels<MySharedViewModel>(R.id.nested_nav_graph)
Run Code Online (Sandbox Code Playgroud)

父片段包含一个 viewPager,并且传递给该 viewPager 的片段都与父片段共享相同的 viewModel。我使用这种方法的问题是,当涉及使用 Espresso 进行涉及 navGraphViewModels 的 UI 测试时,我收到错误“View XXX 没有设置 NavController”。我设法通过以下内容修复了父片段的问题:

        val navController = TestNavHostController(ApplicationProvider.getApplicationContext())
        // This allows fragments to use by navGraphViewModels()
        navController.setViewModelStore(ViewModelStore())
        UiThreadStatement.runOnUiThread {
            navController.setGraph(R.navigation.nested_nav_graph)
        }
        val scenario =
            launchFragmentInContainer(themeResId = R.style.AppTheme) {
                MyFragment().also { fragment ->
                    fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
                        if (viewLifecycleOwner != null) {
                            Navigation.setViewNavController(fragment.requireView(), navController)
                        }
                    }
                }
            }
        return navController
    }
Run Code Online (Sandbox Code Playgroud)

但是,由于父片段随后将其子片段加载到 viewPager 中,并且这些子片段也需要 NavController,因此我的测试不会继续经过 @Before 块。任何有关如何将 navController 设置为子片段的帮助将不胜感激。

android android-fragments android-viewpager android-navigation android-espresso

6
推荐指数
0
解决办法
229
查看次数