کد ناوبری را از مقصدهای قابل ترکیب خود جدا کنید تا بتوانید هر قابل ترکیب را به صورت جداگانه و جدا از قابل ترکیب NavHost آزمایش کنید.
NavController مستقیماً به هیچ composable ارسال نکنید. در عوض، callbackهای ناوبری (lambdas) را به عنوان پارامتر ارسال کنید. این کار به همه composableهای شما اجازه میدهد تا به صورت جداگانه قابل آزمایش باشند، زیرا در تستها به نمونهای از NavController نیاز ندارند.
لامبدا composable در NavHost شما به عنوان پلی بین 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 میتواند مستقل از Navigation با ارسال مقادیر ساختگی و فراخوانیهای برگشتی آزمایش شود.
توصیه میشود تستهایی بنویسید که الزامات ناوبری برنامه شما را با آزمایش NavHost ، اکشنهای ناوبری ارسال شده به composableهای شما و composableهای صفحه نمایش شخصیتان پوشش دهند.
NavHost را آزمایش کنید
برای شروع آزمایش NavHost خود، وابستگی navigation-testing زیر را به فایل build.gradle ماژول app خود اضافه کنید:
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 آزمایش کنید.
یک تست رابط کاربری که مقصد شروع برنامه و 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 خود مراجعه کنید.