แยกโค้ดการนำทางออกจากปลายทางที่ใช้ร่วมกันได้เพื่อเปิดใช้การทดสอบ
แต่ละรายการที่ใช้ร่วมกันได้แยกต่างหากจาก NavHost ที่ใช้ร่วมกันได้
อย่าส่ง NavController ไปยัง Composable โดยตรง แต่ให้ส่ง
การเรียกกลับของการนำทาง (แลมบ์ดา) เป็นพารามิเตอร์แทน ซึ่งจะช่วยให้ทดสอบ Composable ทั้งหมดได้ทีละรายการ เนื่องจากไม่จำเป็นต้องมีอินสแตนซ์ของ
NavController ในการทดสอบ
composable Lambda ใน NavHost จะทำหน้าที่เป็นตัวเชื่อมระหว่าง
Navigation API กับ Composable ของคุณ
@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, การดำเนินการนำทางที่ส่งไปยัง Composable และ Composable ของหน้าจอแต่ละหน้า
ทดสอบ NavHost
หากต้องการเริ่มทดสอบ NavHost ให้เพิ่มทรัพยากร Dependency navigation-testing
ต่อไปนี้ลงในไฟล์ build.gradle ของโมดูลแอป
dependencies {
androidTestImplementation "androidx.navigation:navigation-testing:$navigationVersion"
}
ห่อหุ้ม NavHost ของแอปใน Composable ซึ่งยอมรับ NavHostController เป็นพารามิเตอร์
@Composable
fun AppNavHost(navController: NavHostController){
NavHost(navController = navController, startDestination = Home){
composable<Home> { /*...*/ }
composable<Profile> { /*...*/ }
}
}
ตอนนี้คุณสามารถทดสอบ AppNavHost และตรรกะการนำทางที่กำหนดไว้ภายใน NavHost
โดยส่งอินสแตนซ์ของอาร์ติแฟกต์การทดสอบการนำทาง
TestNavHostController
การทดสอบ UI ที่ยืนยันปลายทางเริ่มต้นของแอปและ 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()
}
}
ทดสอบการดำเนินการนำทาง
คุณทดสอบการติดตั้งใช้งานการนำทางได้หลายวิธีโดยคลิกองค์ประกอบ UI แล้วตรวจสอบจุดหมายที่แสดง หรือเปรียบเทียบเส้นทางที่คาดไว้กับเส้นทางปัจจุบัน
เนื่องจากคุณต้องการทดสอบการใช้งานแอปจริง การคลิกใน UI จึงเป็นวิธีที่เหมาะสมกว่า ดูวิธีทดสอบฟังก์ชัน Composable แต่ละรายการควบคู่กันแบบแยกกันได้ใน Codelab การทดสอบใน Jetpack Compose
นอกจากนี้ คุณยังใช้ navController เพื่อตรวจสอบข้อความยืนยันการนำทางได้โดยการเปรียบเทียบ
เส้นทางปัจจุบันกับเส้นทางที่คาดไว้โดยใช้ currentBackStackEntry ดังนี้
@Test
fun appNavHost_clickProfile_navigatesToProfile() {
composeTestRule.onNodeWithContentDescription("Go to Profile")
.performClick()
assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}
ดูคำแนะนำเพิ่มเติมเกี่ยวกับข้อมูลเบื้องต้นในการทดสอบ Compose ได้ที่คู่มือการทดสอบเลย์เอาต์ Compose