محاكاة التبعيات في الاختبارات
استبدل التنفيذات الحقيقية ببدائل اختبارية.
محاكاة التبعيات في الاختبارات درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
محاكاة الاعتماديات في الاختبارات
الكائن الوهمي هو تنفيذ زائف لاعتمادية يُستخدم في الاختبارات. وبما أننا نحقن البروتوكولات، يمكننا توفير كائن وهمي بدلًا من المكوّن المتعاون الحقيقي.
بروتوكول للمحاكاة
ابدأ من بروتوكول يصف الاعتمادية. يتوافق كل من النوع الحقيقي والكائن الوهمي معه.
protocol UserStore {
func name(for id: Int) -> String
}
struct RealStore: UserStore {
func name(for id: Int) -> String { "User-\(id)" }
}
print(RealStore().name(for: 5))كتابة كائن وهمي
يتوافق الكائن الوهمي مع البروتوكول، لكنه يُرجع قيمًا محددة مسبقًا، متجنبًا الوصول إلى الشبكة أو القرص الحقيقيين.
protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore {
func name(for id: Int) -> String { "Mock" }
}
print(MockStore().name(for: 99))حقن الكائن الوهمي
مرّر الكائن الوهمي إلى النظام قيد الاختبار من خلال مُهيّئه. ولن تتمكن الشفرة قيد الاختبار من معرفة الفرق.
protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore { func name(for id: Int) -> String { "Mock" } }
struct Profile {
let store: UserStore
func title(_ id: Int) -> String { "Hello, " + store.name(for: id) }
}
print(Profile(store: MockStore()).title(1))تسجيل الاستدعاءات
يمكن للكائن الوهمي تسجيل كيفية استخدامه، حتى يتمكن الاختبار من التأكد من استدعاء الاعتمادية بشكل صحيح.
protocol Analytics { func track(_ e: String) }
class SpyAnalytics: Analytics {
var events: [String] = []
func track(_ e: String) { events.append(e) }
}
let spy = SpyAnalytics()
spy.track("open")
spy.track("buy")
print(spy.events)التحقق من السلوك
بعد تشغيل الشفرة، افحص البيانات المسجلة. نتحقق هنا من إطلاق الحدث الصحيح.
protocol Analytics { func track(_ e: String) }
class Spy: Analytics { var last = ""; func track(_ e: String) { last = e } }
struct Checkout { let analytics: Analytics; func pay() { analytics.track("paid") } }
let spy = Spy()
Checkout(analytics: spy).pay()
print(spy.last == "paid")تثبيت القيم المُرجعة
يُرجع البديل التجريبي قيمًا محددة مسبقًا، حتى تتمكن من اختبار استجابة شفرتك لمدخلات معينة.
protocol Clock { func hour() -> Int }
struct StubClock: Clock { let value: Int; func hour() -> Int { value } }
struct Greeter { let clock: Clock; func greet() -> String { clock.hour() < 12 ? "AM" : "PM" } }
print(Greeter(clock: StubClock(value: 9)).greet())
print(Greeter(clock: StubClock(value: 18)).greet())محاكاة الفشل
يمكن للكائنات الوهمية محاكاة حالات الخطأ التي يصعب تشغيلها باستخدام الاعتماديات الحقيقية، مما يحسّن تغطية الاختبارات.
protocol Loader { func load() -> Int? }
struct FailingLoader: Loader { func load() -> Int? { nil } }
struct VM { let loader: Loader; func status() -> String { loader.load() == nil ? "error" : "ok" } }
print(VM(loader: FailingLoader()).status())اختبارات حتمية
بما أن الكائنات الوهمية تُرجع قيمًا ثابتة، تكون الاختبارات سريعة وحتمية، من دون تقلبات ناتجة عن الخدمات الحقيقية.
protocol Random { func next() -> Int }
struct FixedRandom: Random { func next() -> Int { 42 } }
struct Game { let rng: Random; func roll() -> Int { rng.next() } }
print(Game(rng: FixedRandom()).roll())لا يوجد إطار اختبار هنا
في مشروع حقيقي، توجد هذه التحققات في تأكيدات XCTest. ونمط الحقن مطابق؛ ويختلف فقط بناء جملة التأكيد.
protocol Calc { func add(_ a: Int, _ b: Int) -> Int }
struct RealCalc: Calc { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct MockCalc: Calc { func add(_ a: Int, _ b: Int) -> Int { 0 } }
print(RealCalc().add(2, 2))
print(MockCalc().add(2, 2))الدورة الكاملة
عرّف البروتوكول، واكتب نوعين متوافقين حقيقيًا ووهميًا، واحقن الكائن الوهمي، وشغّل الشفرة، ثم تحقّق من النتائج. يجعل حقن الاعتماديات كل خطوة ممكنة.
protocol Repo { func count() -> Int }
struct MockRepo: Repo { func count() -> Int { 3 } }
struct Stats { let repo: Repo; func total() -> Int { repo.count() * 2 } }
print(Stats(repo: MockRepo()).total())تحقق سريع
ما الذي يجعل محاكاة الاعتمادية ممكنة في هذا الأسلوب؟
مراجعة
يتوافق الكائن الوهمي مع البروتوكول المحقون، ويُرجع قيمًا محددة مسبقًا، أو يسجل الاستدعاءات، أو يحاكي حالات الفشل. ويؤدي حقنه إلى إنتاج اختبارات سريعة وحتمية. وتسير الدورة كالتالي: تعريف البروتوكول، وكتابة نوعين متوافقين حقيقي ووهمي، والحقن، والتشغيل، والتحقق. بهذا تكتمل دورة حقن الاعتماديات.
تعلم Swift مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 122
- الدروس
- 409
الأسئلة الشائعة
هل درس «محاكاة التبعيات في الاختبارات» مجاني؟
نعم — نص درس «محاكاة التبعيات في الاختبارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا نستخدم حقن التبعيات
- حقن التبعيات عبر المُنشئ
- التجريدات المستندة إلى البروتوكولات
- محاكاة التبعيات في الاختبارات