هذه الحزمة عبارة عن حزمة مستقلة من برنامج Monkey Patching الخاص بـ ci-phpunit-test.
وهذا يوفر أربعة قرد الرقع.
ExitPatcher
: تحويل exit()
إلى استثناءFunctionPatcher
: وظائف التصحيحاتMethodPatcher
: أساليب التصحيح في الفئات المعرفة من قبل المستخدمConstantPatcher
: تغيير القيم الثابتة exit()
إلى استثناء$ composer require --dev kenjis/monkey-patch
ملحوظة: من المحتمل أن يكون رقم السطر عند حدوث خطأ مختلفًا عن كود المصدر الفعلي. الرجاء التحقق من ملف ذاكرة التخزين المؤقت للمصدر الذي يقوم Monkey Patching بإنشائه.
ملحوظة: استخدام هذه الحزمة له تأثير سلبي على سرعة الاختبارات.
exit()
إلى استثناء يقوم برنامج التصحيح هذا بتحويل عبارات exit()
أو die()
إلى استثناءات سريعة.
إذا كان لديك وحدة تحكم مثل أدناه:
public function index ()
{
$ this -> output
-> set_status_header ( 200 )
-> set_content_type ( ' application/json ' , ' utf-8 ' )
-> set_output ( json_encode ([ ' foo ' => ' bar ' ]))
-> _display ();
exit ();
}
حالة الاختبار يمكن أن تكون مثل هذا:
public function test_index ()
{
try {
$ this -> request ( ' GET ' , ' welcome/index ' );
} catch ( ExitException $ e ) {
$ output = ob_get_clean ();
}
$ this -> assertContains ( ' {"foo":"bar"} ' , $ output );
}
يسمح برنامج التصحيح هذا باستبدال الوظائف العامة التي لا يمكن الاستهزاء بها بواسطة PHPUnit.
ولكن لديها بعض القيود. لا يمكن استبدال بعض الوظائف وقد يتسبب ذلك في حدوث أخطاء.
لذا يمكننا افتراضيًا استبدال عشرات الوظائف المحددة مسبقًا في FunctionPatcher فقط.
public function test_index ()
{
MonkeyPatch:: patchFunction ( ' mt_rand ' , 100 , ' Welcome::index ' );
$ output = $ this -> request ( ' GET ' , ' welcome/index ' );
$ this -> assertContains ( ' 100 ' , $ output );
}
يستبدل MonkeyPatch::patchFunction()
وظيفة PHP الأصلية mt_rand()
في طريقة Welcome::index
، وسيُرجع 100
في طريقة الاختبار.
ملاحظة: إذا قمت باستدعاء MonkeyPatch::patchFunction()
بدون وسيطة ثالثة، فسيتم استبدال جميع الوظائف (الموجودة في include_paths
وليس في exclude_paths
) التي تم استدعاؤها في طريقة الاختبار. لذلك، على سبيل المثال، قد يتم استبدال وظيفة في رمز مكتبتك، ويؤدي ذلك إلى نتيجة غير متوقعة.
يمكنك تغيير قيمة الإرجاع للوظيفة المصححة باستخدام إغلاق PHP:
MonkeyPatch:: patchFunction (
' function_exists ' ,
function ( $ function ) {
if ( $ function === ' random_bytes ' ) {
return true ;
} elseif ( $ function === ' openssl_random_pseudo_bytes ' ) {
return false ;
} elseif ( $ function === ' mcrypt_create_iv ' ) {
return false ;
} else {
return __GO_TO_ORIG__ ;
}
},
Welcome::class
);
إذا كنت تريد تصحيح وظائف أخرى، يمكنك إضافتها إلى function_to_patch في MonkeyPatchManager::init()
.
ولكن هناك بعض القيود المعروفة:
[$this, 'method']
إلى array_map()
ويكون أسلوب method()
في الفصل الدراسي غير عام.يسمح برنامج التصحيح هذا باستبدال الأساليب في الفئات المعرفة من قبل المستخدم.
public function test_index ()
{
MonkeyPatch:: patchMethod (
Category_model::class,
[ ' get_category_list ' => [( object ) [ ' name ' => ' Nothing ' ]]]
);
$ output = $ this -> request ( ' GET ' , ' welcome/index ' );
$ this -> assertContains ( ' Nothing ' , $ output );
}
يستبدل MonkeyPatch::patchMethod()
طريقة get_category_list()
في Category_model
، وسيُرجع [(object) ['name' => 'Nothing']]
في طريقة الاختبار.
يسمح هذا الرقع باستبدال القيمة الثابتة.
public function test_index ()
{
MonkeyPatch:: patchConstant (
' ENVIRONMENT ' ,
' development ' ,
Welcome::class . ' ::index '
);
$ output = $ this -> request ( ' GET ' , ' welcome/index ' );
$ this -> assertContains ( ' development ' , $ output );
}
يستبدل MonkeyPatch::patchConstant()
القيمة المرجعة للثابت ENVIRONMENT
في طريقة Welcome::index
.
هناك بعض القيود المعروفة:
راجع مستندات اختبار ci-phpunit.
تم ترخيص هذه الحزمة باستخدام ترخيص MIT.
يرجى إلقاء نظرة على LICENSE
.