Этот пакет представляет собой автономный пакет 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-test.
Этот пакет лицензируется с использованием лицензии MIT.
Пожалуйста, обратите внимание на LICENSE
.