Pisahkan kode navigasi dari tujuan composable untuk memungkinkan pengujian setiap composable secara terpisah dari composable NavHost.
Jangan meneruskan NavController langsung ke composable mana pun. Sebagai gantinya, teruskan callback navigasi (lambda) sebagai parameter. Hal ini memungkinkan semua composable Anda dapat diuji satu per satu, karena tidak memerlukan instance NavController dalam pengujian.
Lambda composable di NavHost Anda bertindak sebagai jembatan antara Navigation API dan composable Anda:
@Composable
fun ProfileScreen(
userId: String,
navigateToFriendProfile: (friendUserId: String) -> Unit
) {
// …
}
// In your NavHost
composable<Profile> { backStackEntry ->
val profile = backStackEntry.toRoute<Profile>()
ProfileScreen(userId = profile.id) { friendUserId ->
navController.navigate(route = Profile(id = friendUserId))
}
}
Dengan cara ini, ProfileScreen dapat diuji secara independen dari Navigasi dengan meneruskan nilai dan callback tiruan.
Sebaiknya tulis pengujian yang mencakup persyaratan navigasi aplikasi Anda dengan menguji NavHost, tindakan navigasi yang diteruskan ke composable, dan setiap composable layar.
Menguji NavHost
Untuk mulai menguji NavHost, tambahkan dependensi pengujian navigasi berikut ke file build.gradle modul aplikasi Anda:
dependencies {
androidTestImplementation "androidx.navigation:navigation-testing:$navigationVersion"
}
Gabungkan NavHost aplikasi Anda dalam composable yang menerima
NavHostController sebagai parameter:
@Composable
fun AppNavHost(navController: NavHostController){
NavHost(navController = navController, startDestination = Home){
composable<Home> { /*...*/ }
composable<Profile> { /*...*/ }
}
}
Sekarang Anda dapat menguji AppNavHost dan logika navigasi yang ditentukan di dalam NavHost
dengan meneruskan instance artefak pengujian navigasi
TestNavHostController.
Pengujian UI yang memverifikasi tujuan awal aplikasi Anda dan NavHost akan terlihat seperti ini:
class NavigationTest {
@get:Rule
val composeTestRule = createComposeRule()
lateinit var navController: TestNavHostController
@Before
fun setupAppNavHost() {
composeTestRule.setContent {
navController = TestNavHostController(LocalContext.current)
navController.navigatorProvider.addNavigator(ComposeNavigator())
AppNavHost(navController = navController)
}
}
@Test
fun appNavHost_verifyStartDestination() {
composeTestRule
.onNodeWithContentDescription("Start Screen")
.assertIsDisplayed()
}
}
Menguji tindakan navigasi
Anda dapat menguji implementasi navigasi dalam beberapa cara dengan melakukan klik pada elemen UI, lalu memverifikasi tujuan yang ditampilkan atau dengan membandingkan rute yang diharapkan dengan rute saat ini.
Sebaiknya klik UI karena Anda ingin menguji penerapan aplikas yang konkret. Untuk mempelajari cara mengujinya beserta setiap fungsi composable individualnya secara terpisah, lihat codelab Pengujian di Jetpack Compose.
Anda juga dapat menggunakan navController untuk memeriksa pernyataan navigasi dengan membandingkan rute saat ini dengan rute yang diharapkan, menggunakan currentBackStackEntry:
@Test
fun appNavHost_clickProfile_navigatesToProfile() {
composeTestRule.onNodeWithContentDescription("Go to Profile")
.performClick()
assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}
Untuk panduan selengkapnya tentang dasar-dasar pengujian Compose, lihat panduan Menguji tata letak Compose.