افصل رمز التنقّل عن وجهاتك القابلة للإنشاء لتتمكّن من اختبار كل دالة مركّبة بشكل منفصل عن الدالة NavHost المركّبة.
لا تمرِّر NavController مباشرةً إلى أي عنصر قابل للإنشاء. بدلاً من ذلك، مرِّر عمليات معاودة الاتصال الخاصة بالتنقّل (lambdas) كمَعلمات. يتيح ذلك إمكانية اختبار جميع العناصر القابلة للإنشاء بشكل فردي، لأنّها لا تتطلّب مثيلاً من NavController في الاختبارات.
تعمل دالة composable lambda في NavHost كجسر بين واجهات برمجة التطبيقات الخاصة بالتنقّل ودالتك المركّبة:
@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()
}
}
اختبار إجراءات التنقّل
يمكنك اختبار عملية تنفيذ التنقّل بعدة طرق، وذلك من خلال النقر على عناصر واجهة المستخدم ثم التحقّق من الوجهة المعروضة أو من خلال مقارنة المسار المتوقّع بالمسار الحالي.
بما أنّك تريد اختبار تنفيذ تطبيقك الملموس، يُفضّل استخدام النقرات على واجهة المستخدم. للتعرّف على كيفية اختبار ذلك إلى جانب الدوال الفردية القابلة للإنشاء بشكل منفصل، راجِع الدرس التطبيقي حول الترميز الاختبار في Jetpack Compose.
يمكنك أيضًا استخدام navController للتحقّق من صحة بيانات التنقل من خلال مقارنة المسار الحالي بالمسار المتوقّع باستخدام currentBackStackEntry:
@Test
fun appNavHost_clickProfile_navigatesToProfile() {
composeTestRule.onNodeWithContentDescription("Go to Profile")
.performClick()
assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}
للحصول على مزيد من الإرشادات حول أساسيات اختبار Compose، راجِع دليل اختبار تصميم Compose.