هل سئمت من تذكر الفرق بين المستهزئين والجزئيين والجواسيس في لعبة Mockery؟ أنا كذلك، ولهذا السبب قمت بإنشاء double()
- وهي طريقة مساعدة بسيطة لتسهيل استخدام Mockery.
عند كتابة الاختبارات، لا أريد أن أفكر في الاختلافات بين المنتجات المزيفة والمقلدة والجواسيس . أنا فقط أقوم بإنشاء اختبار عام مزدوج والتركيز على كتابة الاختبار الخاص بي. يعد هذا التعميم شائعًا في أطر عمل الاختبار الأخرى مثل RSpec وtd.js والمزيد.
لتثبيت أحدث إصدار من المساعد double()
، قم بتشغيل الأمر:
composer require --dev jasonmccreary/test-double
في أي وقت تحتاج إلى إنشاء اختبار مزدوج، ما عليك سوى الاتصال double()
افتراضيًا، تُرجع الدالة double()
كائنًا يسمح لك بإيقاف الأساليب بالإضافة إلى التحقق من استدعاءات الأساليب.
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
في Mockery، هذا الاختبار المزدوج يعادل Mockery::mock()->shouldIgnoreMissing()
أو Mockery::spy()
في الإصدارات الأخيرة.
يمكنك أيضًا تمرير إشارة double()
إلى فئة أو واجهة. سيؤدي هذا إلى إنشاء كائن اختبار يعمل على توسيع الفصل أو تنفيذ الواجهة. يسمح هذا للمضاعفة بتمرير أي تلميحات للنوع أو التحقق من النوع في التنفيذ الخاص بك.
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
وأخيرًا، يقبل double()
الوسيطة الثانية من passthru . افتراضيًا، يكون passthru false
. عند التعيين على true
، سيقوم كائن الاختبار بتمرير أي استدعاءات للأسلوب إلى الكائن الأساسي.
في Mockery، هذا يعادل Mockery::mock(Number::class)->shouldDeferMissing()
.
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
ملاحظة: لا يمكن استخدام التمرير إلا عند إنشاء اختبار مزدوج بمرجع فئة حيث أن هذه هي المرة الوحيدة التي يوجد فيها تطبيق أساسي.
في النهاية، double()
هي طريقة مدروسة لإنشاء كائنات اختبار للتعليمات البرمجية الأساسية الخاصة بك. إذا لم يلبي احتياجاتك، فيمكنك دائمًا إنشاء Mockery::mock()
مباشرةً. ومع ذلك، من المحتمل أن يكون القيام بذلك بمثابة رائحة اختبار التنفيذ الخاص بك بطريقة لا تعكس سلوك العالم الحقيقي. تذكر double()
تُرجع كائنًا ينفذ MockeryInterface
. لذلك يمكن معاملته كأي كائن Mockery::mock()
آخر.