このパッケージは、 ci-phpunit-test の Monkey Patching のスタンドアロン パッケージです。
これにより、4 つのモンキー パッチャーが提供されます。
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 で事前に定義された 12 個の関数のみを置き換えることができます。
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
を返します。
注: 3 番目の引数を指定せずに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()
の function_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
をご覧ください。