这个包是 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
。