فهم الفرق بين createMock
و getMockBuilder
في phpUnit
createMock
و getMockBuilder
هما طرق لإنشاء test doubles (مثيلات افتراضية) في PHPUnit، لكنهما يستخدمان أساليب مختلفة ويوفران مزايا مختلفة.
createMock($type)
createMock
هي طريقة بسيطة لإنشاء test double لنوع محدد. عند استخدامها، يقوم PHPUnit تلقائيًا بإنشاء test double للنوع المحدد وإعادته لك. إليك مثال:
php$mock = $this->createMock(MyClass::class);
هذا سينشئ test double لـ MyClass
ويعيده لك للاستخدام في اختباراتك.
getMockBuilder($type)
getMockBuilder
تسمح لك بتخصيص عملية إنشاء test double أكثر، باستخدام واجهة سلسلة التحكم (fluent interface). يمكنك استخدام هذا الأسلوب لتحديد سلوك معين لل test double مثل إعادة قيم محددة أو إطلاق استثناء عند استدعاء الدالة. إليك مثال:
php$mockBuilder = $this->getMockBuilder(MyClass::class);
$mockBuilder->setMethods(['myMethod'])
->setConstructorArgs([$arg1, $arg2])
->getMock();
في هذا المثال، نستخدم getMockBuilder
لتحديد الدوال التي سيحتويها test double (setMethods
) والمعاملات التي يجب تمريرها للمُنشئ (setConstructorArgs
) قبل أن نستدعي getMock
لإنشاء ال test double.
الفرق الرئيسي
createMock
تنتج test double بشكل سريع وبسيط، بينماgetMockBuilder
توفر لك تحكمًا أكبر في سلوك test double.createMock
للحالات التي لا تحتاج فيها إلى تخصيص متقدم، بينماgetMockBuilder
تستخدم عندما تحتاج إلى تحديد سلوك معين لل test double.
مثال كامل
لنفترض أن لدينا الكلاس التالي:
phpclass MathOperations
{
public function add($a, $b)
{
return $a + $b;
}
}
ونريد اختبار دالة add
باستخدام test double. إليك كيف يمكن تحقيق ذلك باستخدام createMock
و getMockBuilder
:
استخدام createMock
:
phpclass MathOperationsTest extends TestCase
{
public function testAdd()
{
$mathMock = $this->createMock(MathOperations::class);
$mathMock->expects($this->once())
->method('add')
->with(2, 3)
->willReturn(5);
$result = $mathMock->add(2, 3);
$this->assertEquals(5, $result);
}
}
استخدام getMockBuilder
:
phpclass MathOperationsTest extends TestCase
{
public function testAdd()
{
$mathMock = $this->getMockBuilder(MathOperations::class)
->getMock();
$mathMock->method('add')
->with(2, 3)
->willReturn(5);
$result = $mathMock->add(2, 3);
$this->assertEquals(5, $result);
}
}
تستطيع أن ترى أن getMockBuilder
يوفر تحكمًا أكبر في سلوك الـ test double بينما createMock
يكون أكثر سرعة في الاستخدام العادي.
المزيد من المعلومات
طبعاً، هنا بعض المعلومات الإضافية حول createMock
و getMockBuilder
في PHPUnit:
-
استخدام
createMock
بشكل عام:- عند استخدام
createMock
, يتم إنشاء test double للفئة المحددة دون تخصيص إضافي. - يُفضل استخدام
createMock
للحالات البسيطة التي لا تتطلب تخصيص معقد لسلوك test double.
- عند استخدام
-
استخدام
getMockBuilder
بشكل عام:- تُستخدم
getMockBuilder
لتخصيص إنشاء test double بشكل أكبر. - يمكن استخدام سلسلة التحكم (fluent interface) المقدمة من
getMockBuilder
لتحديد العديد من السمات لل test double مثل الدوال المزيفة والقيم التي يجب إرجاعها.
- تُستخدم
-
التحكم في سلوك test double:
- باستخدام
getMockBuilder
, يمكنك تحديد سلوك test double بدقة عن طريق استخدامsetMethods
لتحديد الدوال وsetConstructorArgs
لتحديد المعاملات التي يجب تمريرها للمُنشئ. - يمكنك أيضًا استخدام
expects
وwillReturn
لتحديد سلوك معين للدالة المزيفة.
- باستخدام
-
عدم استخدام
getMockBuilder
في بعض الحالات:- في الحالات التي لا تتطلب تخصيص معقد لسلوك test double، يمكنك استخدام
createMock
بسهولة دون الحاجة إلىgetMockBuilder
.
- في الحالات التي لا تتطلب تخصيص معقد لسلوك test double، يمكنك استخدام
-
مزايا
getMockBuilder
:- توفر
getMockBuilder
تحكمًا أكبر في سلوك test double، مما يسمح لك بتحديد سلوك محدد دون الحاجة إلى تغيير الكثير من الشفرة.
- توفر
باختصار، يمكن استخدام createMock
لإنشاء test double بسرعة وبساطة في الحالات البسيطة، بينما يمكن استخدام getMockBuilder
لتخصيص إنشاء test double بشكل أكبر عند الحاجة إلى تحديد سلوك معين لل test double.