Compose'da gezinmeyi test etme

Her bir composable'ın NavHost composable'dan ayrı olarak izole bir şekilde test edilmesini sağlamak için gezinme kodunu composable hedeflerinizden ayırın.

NavController değerini doğrudan herhangi bir composable'a iletmeyin. Bunun yerine, gezinme geri çağırmalarını (lambda) parametre olarak iletin. Bu sayede, testlerde NavController örneği gerektirmediğinden tüm composable'larınız ayrı ayrı test edilebilir.

NavHost içindeki composable lambda, Navigation API'leri ile composable'ınız arasında köprü görevi görür:

@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))
    }
}

Bu şekilde, sahte değerler ve geri çağırmalar iletilerek ProfileScreen, gezinmeden bağımsız olarak test edilebilir.

NavHost, composable'larınıza iletilen gezinme işlemleri ve tek tek ekran composable'larınızı test ederek uygulamanızın gezinme şartlarını karşılayan testler yazmanız önerilir.

NavHost'u test etme

NavHost test etmeye başlamak için aşağıdaki navigation-testing bağımlılığını uygulama modülünüzün build.gradle dosyasına ekleyin:

dependencies {
  androidTestImplementation "androidx.navigation:navigation-testing:$navigationVersion"
}

Uygulamanızın NavHost öğesini, parametre olarak NavHostController kabul eden bir composable ile sarmalayın:

@Composable
fun AppNavHost(navController: NavHostController){
  NavHost(navController = navController, startDestination = Home){
      composable<Home> { /*...*/ }
      composable<Profile> { /*...*/ }
  }
}

Artık gezinme testi yapay nesnesinin bir örneğini ileterek AppNavHost ve NavHost içinde tanımlanan gezinme mantığını test edebilirsiniz TestNavHostController.

Uygulamanızın başlangıç hedefini doğrulayan bir kullanıcı arayüzü testi NavHost şöyle görünür:

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()
    }
}

Gezinme işlemlerini test etme

Kullanıcı arayüzü öğelerini tıklayarak ve ardından gösterilen hedefi doğrulayarak veya beklenen rotayı mevcut rotayla karşılaştırarak gezinme uygulamanızı birden fazla şekilde test edebilirsiniz.

Uygulamanızın somut uygulamasını test etmek istediğiniz için kullanıcı arayüzündeki tıklamalar tercih edilir. Bunu ayrı composable işlevlerle birlikte nasıl test edeceğinizi öğrenmek için Jetpack Compose'da Test adlı codelab'e göz atın.

Ayrıca, currentBackStackEntry kullanarak mevcut rotayı beklenen rotayla karşılaştırarak gezinme onaylarını kontrol etmek için navController öğesini de kullanabilirsiniz:

@Test
fun appNavHost_clickProfile_navigatesToProfile() {
    composeTestRule.onNodeWithContentDescription("Go to Profile")
        .performClick()

    assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}

Compose'da test etmeyle ilgili temel bilgiler hakkında daha fazla bilgi için Compose düzeninizi test etme kılavuzuna bakın.