質問: ↓のようなコードのテストコードを書かないといけない場合 ``` class Standard_Function extends \Utility { /** * @param array 1,2 * @return array */ public static function get_Shuffle($array) { return shuffle($array); } } ``` PHPの標準関数shuffleの戻り値を固定にしないとテストが通らないと考えており、 shuffleをaspectMockで置き換えようとしましたが、うまくいきませんでした。 現在アサートする前にsortすることで無理やり動かしている状態です。 この例の場合、テストを書くとしたらどういう風にテストを書くか。 ご教授いただけると幸いです。
回答: Yukihiro Honda さんの示されているとおり、override_functionを使えば組み込み関数を上書きすることは可能かと思います。 ``` override_function('shuffle', '$array', 'return $array;'); ``` ただし、これを利用するにはAPD (Advanced PHP Debugger)モジュールのインストールが必要なので注意してください。 また、Is it possible to overwrite a function in PHP - Stack Overflowでは名前空間を利用して関数をオーバーライドする手法が提案されています。 もし、テスト対象が名前空間に属しているのなら名前空間内にモックしたい関数を定義すればそれを使えそうです。 ``` namespace Your\Name\Space { function shuffle($array) { return $array; } } ``` いずれにせよ、「1度きり」ではないため上書きしてしまうと他のテストにも影響するという注意は必要です。(その心配は無用かもしれませんが。) (後者を使いやすくしたライブラリもあるようです。 php-mock/php-mock: Mock built-in PHP functions (e.g. time(), exec() or rand()))