محاكاة التبعيات باستخدام PHPUnit
أنشئوا كائنات وهمية لعزل الوحدات والتحكم في سلوك المتعاونين
محاكاة التبعيات باستخدام PHPUnit درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
لماذا نستخدم Mock؟
تستبدل Mock تبعية حقيقية، مثل قاعدة بيانات أو خدمة بريد إلكتروني أو عميل HTTP، ببديل وهمي يمكن التحكم فيه، بحيث تكون الاختبارات سريعة ومعزولة وحتمية.
createMock()
ينشئ createMock(ClassName::class) كائن Mock ينفّذ جميع أساليب الفئة، ويعيد null افتراضيًا.
<?php
$mailer = $this->createMock(Mailer::class);
// All methods return null by defaultتوقّع استدعاءات الأساليب
استخدم expects() مع أدوات المطابقة مثل once() وexactly(3) وnever() وany() للتحقق من استدعاء الأساليب بالعدد الصحيح من المرات.
<?php
$mailer->expects($this->once())
->method("send")
->with("user@example.com", "Welcome!");تحديد قيم الإرجاع في Mock
استخدم willReturn() لجعل أسلوب Mock يعيد قيمة محددة.
<?php
$repo = $this->createMock(UserRepository::class);
$repo->method("find")
->willReturn(new User(id: 1, name: "Alice"));willReturnMap()
أعد قيمًا مختلفة تبعًا للوسيط باستخدام willReturnMap().
<?php
$cache->method("get")
->willReturnMap([
["key:1", "value-one"],
["key:2", "value-two"],
]);willThrowException()
اجعل Mock يلقي استثناءً لاختبار مسارات معالجة الأخطاء.
<?php
$repo->method("find")
->willThrowException(new DatabaseException("Connection lost"));مطابقات الوسائط
استخدم مطابقات الوسائط داخل with() لإجراء تأكيدات مرنة: $this->anything() و$this->equalTo() و$this->isInstanceOf().
<?php
$logger->expects($this->once())
->method("log")
->with($this->stringContains("error"));Mocks جزئية (getMockBuilder)
استخدم getMockBuilder() مع onlyMethods() لمحاكاة أساليب محددة مع الإبقاء على التطبيقات الفعلية للأساليب الأخرى.
<?php
$svc = $this->getMockBuilder(EmailService::class)
->onlyMethods(["sendRaw"])
->getMock();
$svc->method("sendRaw")->willReturn(true);نمط Spy
يسجّل Spy جميع الاستدعاءات حتى تتمكن من التحقق منها بعد التنفيذ. ويمكن لـ Mocks في PHPUnit العمل كـ Spy باستخدام any() والتقاط الوسائط.
حقن Mocks
مرّر Mocks إلى الفئة قيد الاختبار عبر الحقن في المُنشئ، وهو النمط القياسي لكتابة تعليمات برمجية قابلة للاختبار وغير مترابطة.
<?php
$service = new NotificationService($mailer, $logger);
$service->notify($user);Mocks للواجهات مقابل الفئات الملموسة
تُفضّل محاكاة الواجهات؛ إذ لا تتسرّب تفاصيل التنفيذ إلى الاختبار، وتظل الاختبارات صالحة حتى إذا تغيّر التنفيذ الفعلي.
الملخص
استخدم createMock() لعزل التبعيات. استخدم expects()->method()->with()->willReturn() لتحديد التوقعات والبدائل. احقن Mocks عبر المُنشئ.
تحقّق سريع
أي أسلوب يجعل Mock يعيد قيمة محددة؟
الأسئلة الشائعة
هل درس «محاكاة التبعيات باستخدام PHPUnit» مجاني؟
نعم — نص درس «محاكاة التبعيات باستخدام PHPUnit» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «محاكاة التبعيات باستخدام PHPUnit»؟
أنشئوا كائنات وهمية لعزل الوحدات والتحكم في سلوك المتعاونين تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «محاكاة التبعيات باستخدام PHPUnit»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد PHPUnit وأول اختبار
- التأكيدات وأساليب الاختبار
- موفّرو البيانات للاختبارات ذات المعاملات
- محاكاة التبعيات باستخدام PHPUnit