כדי לבדוק כל קומפוזיציה בנפרד, בלי קשר לקומפוזיציה NavHost, צריך להפריד את קוד הניווט מהיעדים שניתנים לקומפוזיציה.
אל תעבירו את NavController ישירות לכל רכיב שאפשר להרכיב. במקום זאת, מעבירים קריאות חוזרות (lambdas) של ניווט כפרמטרים. כך אפשר לבדוק כל אחד מהרכיבים הניתנים להרכבה בנפרד, כי הם לא דורשים מופע של NavController בבדיקות.
פונקציית ה-lambda composable ב-NavHost משמשת כגשר בין ממשקי ה-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 בנפרד מ-Navigation על ידי העברת ערכים ופונקציות קריאה חוזרת מדומים.
מומלץ לכתוב בדיקות שמכסות את דרישות הניווט באפליקציה על ידי בדיקת 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> { /*...*/ }
}
}
עכשיו אפשר לבדוק את AppNavHost ואת לוגיקת הניווט שמוגדרת בתוך NavHost
על ידי העברת מופע של ארטיפקט בדיקת הניווט
TestNavHostController.
בדיקת ממשק משתמש שמאמתת את יעד ההתחלה של האפליקציה 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()
}
}
בדיקת פעולות ניווט
יש כמה דרכים לבדוק את ההטמעה של הניווט. אפשר ללחוץ על רכיבי ממשק המשתמש ואז לוודא שהיעד מוצג, או להשוות בין המסלול הצפוי למסלול הנוכחי.
מכיוון שאתם רוצים לבדוק את ההטמעה של האפליקציה הספציפית שלכם, עדיף להשתמש בקליקים על ממשק המשתמש. כדי ללמוד איך לבדוק את זה לצד פונקציות קומפוזביליות נפרדות בבידוד, אפשר לעיין ב-Codelab בנושא בדיקות ב-Jetpack Compose.
אפשר גם להשתמש ב-navController כדי לבדוק טענות לגבי ניווט על ידי השוואה בין המסלול הנוכחי למסלול הצפוי, באמצעות currentBackStackEntry:
@Test
fun appNavHost_clickProfile_navigatesToProfile() {
composeTestRule.onNodeWithContentDescription("Go to Profile")
.performClick()
assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}
במדריך בדיקת פריסת פיתוח נייטיב מוסבר איך לבדוק את פריסת הפיתוח הנייטיב.