

↓のようなコードのテストコードを書かないといけない場合

[code]

    class Standard_Function extends \Utility {
        /**
         * @param array [1,2](固定)
         * @return array
         */
        public static function get_Shuffle($array) {
            return shuffle($array);
        }
    }
    
[/code]

PHPの標準関数shuffleの戻り値を固定にしないとテストが通らないと考えており、  
shuffleをaspectMockで置き換えようとしましたが、うまくいきませんでした。  
現在アサートする前にsortすることで無理やり動かしている状態です。

この例の場合、テストを書くとしたらどういう風にテストを書くか。  
ご教授いただけると幸いです。


CC BY-SA 3.0
2016-11-22T11:19:13.443
30598
2016-11-29T12:05:18.153
2016-11-29T12:05:18.153
8000
7918
question
php テスト phpunit
PHPで標準関数をモック化したい。


[(php.net)override_function](http://php.net/manual/ja/function.override-
function.php) は使用できないしょうか？


CC BY-SA 3.0
2016-11-22T11:56:34.600
30599
2016-11-22T11:56:34.600
2020-06-17T08:14:45.997
-1
7343
30598
answer


Yukihiro Honda
さんの示されているとおり、[override_function](http://php.net/manual/ja/function.override-
function.php)を使えば組み込み関数を上書きすることは可能かと思います。

[code]

    override_function('shuffle', '$array', 'return $array;');
    
[/code]

ただし、これを利用するには[APD (Advanced PHP
Debugger)](http://php.net/manual/ja/intro.apd.php)モジュールのインストールが必要なので注意してください。

また、[Is it possible to overwrite a function in PHP - Stack
Overflow](https://stackoverflow.com/questions/3620659/is-it-possible-to-
overwrite-a-function-in-php)では名前空間を利用して関数をオーバーライドする手法が提案されています。

もし、テスト対象が名前空間に属しているのなら名前空間内にモックしたい関数を定義すればそれを使えそうです。

[code]

    namespace Your\Name\Space {
        function shuffle($array) {
            return $array;
        }
    }
    
[/code]

いずれにせよ、「1度きり」ではないため上書きしてしまうと他のテストにも影響するという注意は必要です。(その心配は無用かもしれませんが。)

(後者を使いやすくしたライブラリもあるようです。 [php-mock/php-mock: Mock built-in PHP functions (e.g.
time(), exec() or rand())](https://github.com/php-mock/php-mock))


CC BY-SA 3.0
2016-11-22T14:07:10.733
30601
2016-11-22T14:19:53.860
2017-05-23T12:38:55.250
-1
2376
30598
answer