PHPのテストでモック処理を調べた雑感

2024/03/22に公開

結論

モックしづらい。

PHPは、型が適当な言語のくせに、処理の入れ替えであるモックはしづらいという。。。

型がある言語並みにお堅い一方で、型が無い言語ほどには柔軟性がない。

そんな印象でした。

Laravelを使っているなら、基本的にDIで行くのが良いかと。

自分の実装方針としては、Rich Hickeyのシンプルさの必要性という記事を体現したいと思っている。
https://eed3si9n.com/ja/simplicity-matters/

なので、出来うる限り普通の関数で作っていき、モックが必要な部分だけDIで置き換える形かな?と思った。

例を上げると

staticメソッドの置き換え。

self::hoge で書くと置き換えできないので、static::hoge と書くと良いなどがある。

遅延静的束縛 (Late Static Bindings)
https://www.php.net/manual/ja/language.oop5.late-static-bindings.php

上記が関係しているらしいが、マニアックすぎないか?と思ったりした。

詳しくは、phakeというMockライブラリのドキュメント参照
https://phake.github.io/doc/mocking-statics/

ひとこと

traitで全体的に適用しているメソッドの動作を変えたかったのですが、インスタンスを作成した後では置き換えできないはずで、なんとかならんかなぁと調べていた形です。

上記は、結局フラグで対応したのですが、テストのための動作変更にモック化ができず、プロダクションコードの変更が伴うのは、なんかなぁと思った次第です。
(もしかしたら、見つけられてないだけで、良い案があるのかもしれないですが。。。)

あと、後からテスト入れ込むと大抵テストしづらいコードになるので、最初から入れておきたいところですね。。。

Discussion