我用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())
}
字符串
接下来我想做的是按下正在打开的片段中包含的logout按钮,但看起来onView
仍然引用登录片段的视图。是否可以让单个测试遵循导航图的视图hiylogy?
1条答案
按热度按时间u59ebvdq1#
TestNavHostController
实际上并不显示任何片段-它依赖于其他测试基础设施(如launchFragmentInContainer
)来实际创建测试中的单个片段。因此,即使在
TestNavHostController
上调用navigate
之后,测试中的单个片段仍然会出现在屏幕上-您的测试所要做的就是验证LoginFragment
是否根据您提供的输入在正确的时间正确地调用了navigate
。您不需要测试附加到真实的
NavController
的真实的NavHostFragment
是否在您调用navigate
时实际上替换了您的Fragment--这不是您的代码,而是已经是covered by an extensive test suite的代码。但是,如果您确实想编写完整的集成风格测试,那么您将不会使用
TestNavHostController
,而是测试完整的Activity并使用Activity中的实际NavHostFragment
。