اختبار نماذج العرض
اختبر منطق العرض وحداتيًا وبشكل مستقل.
اختبار نماذج العرض درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
لماذا تختبر ViewModels؟
يحتوي ViewModel على منطق العرض، مما يجعله الطبقة الأهم لاختبارها باختبارات الوحدات. وبما أنه لا يعتمد على UIKit أو SwiftUI، يمكنك اختباره بمعزل بسرعة وبطريقة حتمية.
قابلية الاختبار من خلال التصميم
يستقبل ViewModel المصمم جيدًا اعتمادياته عبر المُهيئ. وهذا يتيح للاختبارات استبدالها ببدائل وهمية.
final class WeatherViewModel: ObservableObject {
@Published var temperatureText = ""
private let service: WeatherService
init(service: WeatherService) {
self.service = service
}
}حقن الاعتماديات
أخفِ الاعتماديات الفعلية خلف بروتوكول. يعتمد ViewModel على التجريد، ولذلك يمكن للاختبارات حقن mock.
protocol WeatherService {
func fetchTemperature() async throws -> Double
}كتابة Mock
يلتزم mock بالبروتوكول ويعيد بيانات محددة مسبقًا. وهذا يتيح لك التحكم بدقة فيما يراه ViewModel.
final class MockWeatherService: WeatherService {
var stubbedTemperature: Double = 20
var didCallFetch = false
func fetchTemperature() async throws -> Double {
didCallFetch = true
return stubbedTemperature
}
}اختبار وحدة أساسي
بعد حقن mock، تتحقق من أن ViewModel يحوّل البيانات بشكل صحيح.
func testFormatsTemperature() async {
let mock = MockWeatherService()
mock.stubbedTemperature = 25
let vm = WeatherViewModel(service: mock)
await vm.load()
XCTAssertEqual(vm.temperatureText, "25 C")
}اختبار انتقالات الحالة
تكشف ViewModels غالبًا عن تعداد للحالة. اختبر كل فرع من خلال تمرير المدخلات التي تنتج تلك الحالة.
func testLoadingThenLoaded() async {
let vm = FeedViewModel(service: MockFeedService())
XCTAssertEqual(vm.state, .loading)
await vm.load()
XCTAssertEqual(vm.state, .loaded(["A", "B"]))
}اختبار مسارات الأخطاء
اجعل mock يطرح خطأً للتحقق من أن ViewModel يتعامل مع حالات الفشل بسلاسة ويعرض حالة خطأ.
final class FailingService: WeatherService {
func fetchTemperature() async throws -> Double {
throw URLError(.notConnectedToInternet)
}
}
func testShowsErrorOnFailure() async {
let vm = WeatherViewModel(service: FailingService())
await vm.load()
XCTAssertEqual(vm.state, .error)
}التحقق من التفاعلات
أحيانًا يهمك التأكد من أن اعتمادًا ما قد تم استدعاؤه، وليس التحقق من النتيجة فقط. وتتيح لك علامات spy في mock التحقق من السلوك.
func testFetchIsCalled() async {
let mock = MockWeatherService()
let vm = WeatherViewModel(service: mock)
await vm.load()
XCTAssertTrue(mock.didCallFetch)
}اختبار المخرجات ذات @Published
يمكنك الاشتراك في خاصية @Published باستخدام Combine لالتقاط القيم المنبعثة والتحقق من تسلسلها.
var received: [String] = []
let cancellable = vm.$temperatureText.sink { received.append($0) }
await vm.load()
XCTAssertEqual(received.last, "25 C")
cancellable.cancel()الحفاظ على سرعة الاختبارات
بما أن mocks تعيد النتائج فورًا ولا توجد شبكة فعلية، تُجرى اختبارات ViewModel خلال أجزاء من الثانية. تجنب المؤقتات الفعلية وURLSession — وحقن بدائل للساعات والمُجدولات أيضًا.
أفضل الممارسات
تتضمن اختبارات ViewModel الفعالة ما يلي:
- حقن جميع الاعتماديات عبر البروتوكولات
- اختبار سلوك واحد في كل دالة اختبار
- تغطية مسارات النجاح والفراغ والخطأ
- التحقق من المخرجات المنشورة التي سيقرأها View
اختبار سريع
اختبر معرفتك باختبار ViewModel.
مراجعة
لقد تعلمت اختبار ViewModels باختبارات الوحدات بمعزل:
- حقن الاعتماديات خلف البروتوكولات
- استخدام mocks للتحكم في المدخلات ومراقبة الاستدعاءات
- تغطية حالات النجاح والخطأ والفراغ
- التحقق من مخرجات
@Publishedوانتقالات الحالة
تمثل ViewModels القابلة للاختبار ثمرة فصل المسؤوليات في MVVM.
الأسئلة الشائعة
هل درس «اختبار نماذج العرض» مجاني؟
نعم — نص درس «اختبار نماذج العرض» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «اختبار نماذج العرض»؟
اختبر منطق العرض وحداتيًا وبشكل مستقل. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «اختبار نماذج العرض»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمط MVVM
- ربط نماذج العرض بالعروض
- نمط Coordinator
- اختبار نماذج العرض