前回、グローバル関数への依存について書いたので その流れでWordPressプラグインのテストについて。
投稿やコメント等を取得するためにWordPressが用意してる関数は グローバル関数がほとんどです。
なので、テーマのカスタマイズやらプラグインを作る時に テスタビリティを意識しないとグローバル関数に依存しまくったコードになっちゃいます。
例えば、下記は新着投稿を表示するプラグインなんかでよくあるコードだと思います。
これをテストコードで保護するには最低限下記パターンが必要です。
- get_postsの戻り値が配列でなければ(新着投稿がなければ)、nullを返す
- get_postsの戻り値が配列であれば(新着投稿があれば)、その後の処理をして値を返す
ですがグローバル関数に依存していると、これを実現するのは難しい。
そこで、関数のラッパーオブジェクト(Proxy)を使います。
FooクラスはコンストラクタでFooProxyクラスを受け取っていて、 FooProxyクラスはグローバル関数に処理を委譲しているだけです。
で、テストコードではFooProxyクラスをモックに差し替えればOKです。 例えば
・get_postsの戻り値が配列でなければ(新着投稿がなければ)、nullを返す
のパターンのテストコードは下記のようになります。
同様にして他パターンもテストできます。
これで、モックによってget_postsが返す値を明示することで Foo::bar() の振る舞いを網羅的にテストできるようになりました。