Android中NavigationController的基本测试



我目前是测试新手,所以我决定从一些基本的东西开始。

我处理连接到活动抽屉布局中的所有导航。

因此,为了进行测试,我启动了ActivityScenarioRule,创建了一个testNavController对象,然后将该testNavController设置为处理导航的当前视图(容器片段(。

因此,测试包括打开抽屉单击菜单项(将导航到片段(,因此检查是否导航到片段

然后我检查是否发生了这种情况,但testNavController停留在同一个目的地,这很奇怪,因为它执行点击,所以我决定检查导航控制器(活动中的真实导航控制器(它显示我导航到了正确的片段

这是所需的代码:

@LargeTest
@RunWith(AndroidJUnit4::class)
class MapsActivityTest {
@get:Rule
var activityScenarioRule = ActivityScenarioRule(MapsActivity::class.java)
@Test
fun clickOnDrawerMaps_NavigateToAboutAppFragment() {
//Create TestNavHostController
val testNavController = TestNavHostController(ApplicationProvider.getApplicationContext())
UiThreadStatement.runOnUiThread { // This needed because it throws a exception that method addObserver must be called in main thread
testNavController.setGraph(R.navigation.nav_graph)
}

val scenario = activityScenarioRule.scenario
var navcontroller : NavController? = null
scenario.onActivity {mapsActivity ->
navcontroller = mapsActivity.navController //Get the real navController just to debug
mapsActivity.navController = testNavController //Set the test navController
Navigation.setViewNavController(mapsActivity.binding.containerFragment, testNavController)
}
onView(withId(R.id.drawerLayout)).perform(DrawerActions.open()).check(matches(isOpen()))
onView(withId(R.id.aboutAppFragment)).perform(click())
assertThat(testNavController.currentDestination?.id).isEqualTo(R.id.aboutAppFragment)
}
}

在这个例子中,他们使用了一个Fragment,在启动Fragment时设置了Fragment.requireView((,但我认为这是完全一样的。

我在这里做错了什么?

当您使用ActivityScenario(或ActivityScenarioRule(时,在进行任何onActivity调用之前,您的活动一直处于恢复状态。这意味着当您调用setupWithNavController时,您真正的NavController已经创建并使用。这就是为什么您对setViewNavController()的调用没有效果。

对于这些类型的集成测试(您有一个真正的NavController(,不应该使用TestNavHostController

根据测试导航指南,TestNavHostController是为根本没有任何真正的NavController的单元测试而设计的,例如在隔离测试一个片段时。

最新更新