अपने कंपोज़ेबल डेस्टिनेशन से नेविगेशन कोड को अलग करें, ताकि हर कंपोज़ेबल की अलग से जांच की जा सके. इसके लिए, NavHost कंपोज़ेबल से अलग करें.
NavController को सीधे तौर पर किसी भी कंपोज़ेबल में पास न करें. इसके बजाय, नेविगेशन कॉलबैक (लैम्ब्डा) को पैरामीटर के तौर पर पास करें. इससे आपके सभी कंपोज़ेबल को अलग-अलग टेस्ट किया जा सकता है, क्योंकि उन्हें टेस्ट में NavController के इंस्टेंस की ज़रूरत नहीं होती.
आपके NavHost में मौजूद composable लैंबडा, Navigation API और आपके कंपोज़ेबल के बीच एक पुल की तरह काम करता है:
@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))
}
}
इस तरह, मॉक वैल्यू और कॉलबैक पास करके, नेविगेशन से अलग ProfileScreen को टेस्ट किया जा सकता है.
हमारा सुझाव है कि आप ऐसे टेस्ट लिखें जो आपके ऐप्लिकेशन की नेविगेशन से जुड़ी ज़रूरी शर्तों को पूरा करते हों. इसके लिए, NavHost, आपके कंपोज़ेबल को पास की गई नेविगेशन कार्रवाइयों, और आपके अलग-अलग स्क्रीन कंपोज़ेबल की जांच करें.
NavHost की जांच करना
अपनी NavHost की टेस्टिंग शुरू करने के लिए, अपने ऐप्लिकेशन मॉड्यूल की build.gradle फ़ाइल में, नेविगेशन की टेस्टिंग से जुड़ी यह डिपेंडेंसी जोड़ें:
dependencies {
androidTestImplementation "androidx.navigation:navigation-testing:$navigationVersion"
}
अपने ऐप्लिकेशन के NavHost को ऐसे कंपोज़ेबल में रैप करें जो NavHostController को पैरामीटर के तौर पर स्वीकार करता है:
@Composable
fun AppNavHost(navController: NavHostController){
NavHost(navController = navController, startDestination = Home){
composable<Home> { /*...*/ }
composable<Profile> { /*...*/ }
}
}
अब नेविगेशन टेस्टिंग आर्टफ़ैक्ट TestNavHostController का इंस्टेंस पास करके, AppNavHost और NavHost में तय किए गए नेविगेशन लॉजिक की जांच की जा सकती है.
यूज़र इंटरफ़ेस (यूआई) टेस्ट, आपके ऐप्लिकेशन के शुरुआती डेस्टिनेशन और NavHost की पुष्टि करता है. यह इस तरह दिखेगा:
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()
}
}
नेविगेशन से जुड़ी कार्रवाइयों की जांच करना
नेविगेशन की सुविधा को कई तरीकों से टेस्ट किया जा सकता है. इसके लिए, यूज़र इंटरफ़ेस (यूआई) के एलिमेंट पर क्लिक करें. इसके बाद, दिखाई गई मंज़िल की पुष्टि करें या मौजूदा रास्ते की तुलना अनुमानित रास्ते से करें.
आपको अपने ऐप्लिकेशन के लागू किए गए बदलावों की जांच करनी है. इसलिए, यूज़र इंटरफ़ेस (यूआई) पर क्लिक करना बेहतर होगा. अलग-अलग कंपोज़ेबल फ़ंक्शन के साथ-साथ, इसे अलग से टेस्ट करने का तरीका जानने के लिए, Jetpack Compose में टेस्टिंग कोडलैब देखें.
navController का इस्तेमाल करके, नेविगेशन असर्शन की जांच भी की जा सकती है. इसके लिए, currentBackStackEntry का इस्तेमाल करके, मौजूदा रूट की तुलना अनुमानित रूट से करें:
@Test
fun appNavHost_clickProfile_navigatesToProfile() {
composeTestRule.onNodeWithContentDescription("Go to Profile")
.performClick()
assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}
Compose की टेस्टिंग से जुड़ी बुनियादी बातों के बारे में ज़्यादा जानकारी के लिए, अपने Compose लेआउट की टेस्टिंग करना गाइड देखें.