Paket ini adalah paket mandiri dari Monkey Patching ci-phpunit-test.
Ini menyediakan empat patcher monyet.
ExitPatcher
: Mengonversi exit()
menjadi PengecualianFunctionPatcher
: Fungsi PatchMethodPatcher
: Menambal Metode di Kelas yang Ditentukan PenggunaConstantPatcher
: Mengubah Nilai Konstan exit()
menjadi Pengecualian$ composer require --dev kenjis/monkey-patch
Catatan: Nomor baris saat terjadi kesalahan mungkin berbeda dengan kode sumber sebenarnya. Silakan periksa file cache dari sumber yang dibuat Monkey Patching.
Catatan: Penggunaan paket ini berdampak negatif pada kecepatan pengujian.
exit()
menjadi Pengecualian Patcher ini mengubah pernyataan exit()
atau die()
menjadi pengecualian dengan cepat.
Jika Anda memiliki pengontrol seperti di bawah ini:
public function index ()
{
$ this -> output
-> set_status_header ( 200 )
-> set_content_type ( ' application/json ' , ' utf-8 ' )
-> set_output ( json_encode ([ ' foo ' => ' bar ' ]))
-> _display ();
exit ();
}
Kasus ujinya bisa seperti ini:
public function test_index ()
{
try {
$ this -> request ( ' GET ' , ' welcome/index ' );
} catch ( ExitException $ e ) {
$ output = ob_get_clean ();
}
$ this -> assertContains ( ' {"foo":"bar"} ' , $ output );
}
Patcher ini memungkinkan penggantian fungsi global yang tidak dapat ditiru oleh PHPUnit.
Namun ia memiliki beberapa keterbatasan. Beberapa fungsi tidak dapat diganti dan mungkin menyebabkan kesalahan.
Jadi secara default kita hanya dapat mengganti selusin fungsi yang telah ditentukan sebelumnya di FunctionPatcher.
public function test_index ()
{
MonkeyPatch:: patchFunction ( ' mt_rand ' , 100 , ' Welcome::index ' );
$ output = $ this -> request ( ' GET ' , ' welcome/index ' );
$ this -> assertContains ( ' 100 ' , $ output );
}
MonkeyPatch::patchFunction()
menggantikan fungsi asli PHP mt_rand()
dalam metode Welcome::index
, dan akan mengembalikan 100
dalam metode pengujian.
Catatan: Jika Anda memanggil MonkeyPatch::patchFunction()
tanpa argumen ke-3, semua fungsi (terletak di include_paths
dan bukan exclude_paths
) yang dipanggil dalam metode pengujian akan diganti. Jadi, misalnya, suatu fungsi dalam kode perpustakaan Anda mungkin diganti, dan ini menghasilkan hasil yang tidak diharapkan.
Anda dapat mengubah nilai kembalian fungsi yang ditambal menggunakan penutupan 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
);
Jika Anda ingin menambal fungsi lain, Anda dapat menambahkannya ke function_to_patch di MonkeyPatchManager::init()
.
Namun ada beberapa batasan yang diketahui:
[$this, 'method']
ke array_map()
dan metode method()
di kelas tersebut tidak bersifat publik.Patcher ini memungkinkan penggantian metode di kelas yang ditentukan pengguna.
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()
menggantikan metode get_category_list()
dalam Category_model
, dan akan mengembalikan [(object) ['name' => 'Nothing']]
dalam metode pengujian.
Patcher ini memungkinkan penggantian nilai konstan.
public function test_index ()
{
MonkeyPatch:: patchConstant (
' ENVIRONMENT ' ,
' development ' ,
Welcome::class . ' ::index '
);
$ output = $ this -> request ( ' GET ' , ' welcome/index ' );
$ this -> assertContains ( ' development ' , $ output );
}
MonkeyPatch::patchConstant()
menggantikan nilai kembalian dari konstanta ENVIRONMENT
dalam metode Welcome::index
.
Ada beberapa batasan yang diketahui:
Lihat dokumen ci-phpunit-test.
Paket ini dilisensikan menggunakan Lisensi MIT.
Silakan lihat LICENSE
.