我正在使用 Espresso 测试登录功能,只要我检查导航操作是否会将用户带到具有正确 ID 的片段,它就可以正常工作。
@Test
fun loginLogout() {
val fragmentArgs = bundleOf("numElements" to 0)
val navController = TestNavHostController(ApplicationProvider.getApplicationContext())
val titleScenario = launchFragmentInContainer<LoginFragment>(fragmentArgs, R.style.Theme_Ticketsmspayapp)
titleScenario.onFragment { fragment ->
navController.setGraph(R.navigation.graph_home)
Navigation.setViewNavController(fragment.requireView(), navController)
}
// Login details filling and confirming
assertEquals(navController.currentDestination?.id, R.id.eventsFragment)
onView(ViewMatchers.withId(R.id.logout)).perform(ViewActions.click())
}
接下来我想做的是按下正在打开的片段中包含的注销按钮,但看起来
onView
仍然指的是登录片段的视图。
单个测试是否可以遵循导航图的视图层次结构?
TestNavHostController
具体来说,实际上不会显示任何片段 - 它依赖于其他测试基础设施(如 launchFragmentInContainer
)来实际创建测试下的单个片段。
因此,即使您在
navigate
上调用 TestNavHostController
,您的测试中的单个片段仍将显示在屏幕上 - 您的测试应该做的就是验证您的 LoginFragment
是否正确调用 navigate
根据您提供的输入确定正确的时间。
当您调用
NavHostFragment
时,您不需要测试附加到真实 NavController
的真实 navigate
是否实际替换了您的 Fragment - 这不是 您的代码,而是已经 被广泛测试覆盖的代码套房.
但是,如果您确实想编写完整的集成样式测试,那么您不会使用 TestNavHostController
,而是测试您的完整活动并使用您活动中实际的
NavHostFragment
。