แพ็คเกจนี้เป็นแพ็คเกจสแตนด์อโลนของ Monkey Patching ของ ci-phpunit-test
นี่เป็นโปรแกรมแก้ไขลิงสี่ตัว
ExitPatcher
: แปลง exit()
เป็น ExceptionFunctionPatcher
: แพทช์ฟังก์ชั่น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()
โดยไม่มีอาร์กิวเมนต์ที่ 3 ฟังก์ชันทั้งหมด (อยู่ใน 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
);
หากคุณต้องการแพตช์ฟังก์ชันอื่น ๆ คุณสามารถเพิ่มฟังก์ชันเหล่านั้นลงใน Functions_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-test
แพคเกจนี้ได้รับอนุญาตโดยใช้ใบอนุญาต MIT
โปรดดูที่ LICENSE