0Pricing
Swift Academy · درس

المحاكاة المعتمدة على البروتوكولات وحقن التبعيات

احقنوا البدائل الاختبارية عبر البروتوكولات دون أطر محاكاة خارجية.

المحاكاة المعتمدة على البروتوكولات وحقن التبعيات درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

لماذا استخدام المحاكاة المعتمدة على البروتوكولات؟

يتيح استخدام البروتوكولات كنقاط فصل استبدال التطبيقات الحقيقية ببدائل اختبار دون تعديل شيفرة الإنتاج.

protocol NetworkService {
  func fetch(url: URL) async throws -> Data
}
class RealNetworkService: NetworkService { /* URLSession */ }
class MockNetworkService: NetworkService { /* returns fixtures */ }

تعريف البروتوكول

استخرج بروتوكولًا من التبعية، بحيث يحتوي فقط على الدوال التي تحتاج إليها فئتك.

protocol UserRepository {
  func getUser(id: Int) async throws -> User
  func saveUser(_ user: User) async throws
}

الحقن عبر المُهيئ

مرّر التبعية عبر المُهيئ حتى تتمكن الاختبارات من توفير mock.

class ProfileViewModel {
  private let repo: UserRepository
  init(repo: UserRepository = RealUserRepository()) {
    self.repo = repo
  }
}

كتابة Mock

طبّق البروتوكول بحالة يمكن التحكم فيها: سجّل الاستدعاءات وأعد قيمًا بديلة.

class MockUserRepo: UserRepository {
  var fetchedIds: [Int] = []
  var stubbedUser: User = User(id: 1, name: "Test")
  func getUser(id: Int) async throws -> User {
    fetchedIds.append(id)
    return stubbedUser
  }
  func saveUser(_ user: User) async throws {}
}

قيم الإرجاع البديلة

اضبط القيم البديلة قبل الاختبار للتحكم فيما يعيده mock ومحاكاة سيناريوهات مختلفة.

let mock = MockUserRepo()
mock.stubbedUser = User(id: 42, name: "Alice")
let vm = ProfileViewModel(repo: mock)
await vm.loadProfile(id: 42)
XCTAssertEqual(vm.userName, "Alice")

التحقق من التفاعلات

بعد تشغيل النظام قيد الاختبار، تحقّق من أن mock استُدعي بالوسائط المتوقعة.

XCTAssertEqual(mock.fetchedIds, [42], "Should fetch user 42 exactly once")

محاكاة الأخطاء

ألقِ أخطاءً من mock لاختبار مسارات معالجة الأخطاء في شيفرة الإنتاج.

class FailingRepo: UserRepository {
  func getUser(id: Int) async throws -> User { throw NetworkError.notFound }
  func saveUser(_ user: User) async throws { throw NetworkError.serverError(500) }
}

حقن الخصائص

بدلًا من ذلك، اعرض التبعية كخاصية قابلة للتعيين لتسهيل استبدالها في الاختبارات.

class OrderService {
  var paymentGateway: PaymentGateway = StripeGateway()
}
let service = OrderService()
service.paymentGateway = MockPaymentGateway()

الحقن باستخدام @Environment و@EnvironmentObject

تحقن تطبيقات SwiftUI التبعيات عبر البيئة، مما يجعل اختبار العروض ممكنًا من خلال توفير كائنات بيئة وهمية.

let mockStore = MockCartStore()
let view = CartView().environmentObject(mockStore)

تجنب الإفراط في استخدام المحاكاة

استخدم mock للتبعيات المباشرة فقط، واستعن بالمتعاونين الحقيقيين عندما يكونون حتميين وسريعين.

// OK to use real DateFormatter in tests — it's deterministic
// Mock URLSession — network I/O is slow and non-deterministic

تركيب البروتوكولات لواجهات أضيق

استخدم بروتوكولات أصغر وأكثر تركيزًا، وفق مبدأ فصل الواجهات، حتى تطبق mocks ما هو مطلوب فقط.

protocol Readable { func read() async throws -> [Item] }
protocol Writable { func write(_ item: Item) async throws }
typealias ReadWrite = Readable & Writable

تحقق سريع

ما الفائدة الأساسية من حقن التبعيات عبر بروتوكول بدلًا من نوع ملموس؟

مراجعة الدرس

عرّف نقطة فصل تعتمد على بروتوكول لكل تبعية. احقن التبعية عبر المُهيئ. طبّق mocks تسجل الاستدعاءات وتعيد قيمًا بديلة. حاكِ الأخطاء باستخدام mocks تُلقي الأخطاء. تحقّق من التفاعلات باستخدام XCTAssertEqual على مصفوفات الاستدعاءات المسجلة.

الأسئلة الشائعة

هل درس «المحاكاة المعتمدة على البروتوكولات وحقن التبعيات» مجاني؟

نعم — نص درس «المحاكاة المعتمدة على البروتوكولات وحقن التبعيات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «المحاكاة المعتمدة على البروتوكولات وحقن التبعيات»؟

احقنوا البدائل الاختبارية عبر البروتوكولات دون أطر محاكاة خارجية. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «المحاكاة المعتمدة على البروتوكولات وحقن التبعيات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد X​​CTestCase والتنظيف وطرائق الاختبار
  2. عائلة XCTAssert والتأكيدات التي تطلق الأخطاء
  3. المحاكاة المعتمدة على البروتوكولات وحقن التبعيات
  4. الاختبارات غير المتزامنة وقياس الأداء
← العودة إلى Swift Academy