這個包是 ci-phpunit-test 的 Monkey Patching 的獨立包。
這提供了四個猴子修補程式。
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()
取代了Welcome::index
方法中的 PHP 原生函式mt_rand()
,並且在測試方法中它將傳回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
);
如果你想要修補其他函數,可以將它們加入到MonkeyPatchManager::init()
中的functions_to_patch中。
但有一些已知的限制:
[$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()
取代了Category_model
中的get_category_list()
方法,並且它將在測試方法中傳回[(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()
取代了Welcome::index
方法中常數ENVIRONMENT
的回傳值。
有一些已知的限制:
請參閱 ci-phpunit-test 文件。
該軟體包使用 MIT 許可證進行許可。
請查看LICENSE
。