ทดสอบการไปยังส่วนต่างๆ ของ Compose

แยกโค้ดการนำทางออกจากปลายทางที่ใช้ร่วมกันได้เพื่อเปิดใช้การทดสอบ แต่ละรายการที่ใช้ร่วมกันได้แยกต่างหากจาก 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