ラッパーオブジェクトを使ってテスタビリティを上げる〜WordPressプラグイン

- - posted in PHP, test

前回、グローバル関数への依存について書いたので その流れでWordPressプラグインのテストについて。

投稿やコメント等を取得するためにWordPressが用意してる関数は グローバル関数がほとんどです。

なので、テーマのカスタマイズやらプラグインを作る時に テスタビリティを意識しないとグローバル関数に依存しまくったコードになっちゃいます。

例えば、下記は新着投稿を表示するプラグインなんかでよくあるコードだと思います。

これをテストコードで保護するには最低限下記パターンが必要です。

  • get_postsの戻り値が配列でなければ(新着投稿がなければ)、nullを返す
  • get_postsの戻り値が配列であれば(新着投稿があれば)、その後の処理をして値を返す

ですがグローバル関数に依存していると、これを実現するのは難しい。

そこで、関数のラッパーオブジェクト(Proxy)を使います。

FooクラスはコンストラクタでFooProxyクラスを受け取っていて、 FooProxyクラスはグローバル関数に処理を委譲しているだけです。

で、テストコードではFooProxyクラスをモックに差し替えればOKです。 例えば

・get_postsの戻り値が配列でなければ(新着投稿がなければ)、nullを返す

のパターンのテストコードは下記のようになります。

同様にして他パターンもテストできます。

これで、モックによってget_postsが返す値を明示することで Foo::bar() の振る舞いを網羅的にテストできるようになりました。

Comments