RailsのApplicationControllerのテスト
ApplicationControllerで定義したmethodはどうテストするべきか。
ApplicationControllerのメソッドのテストは単体でテストしにくい。理由としてはbefore_actionとかのhookがセットになってたりするから。ApplicationControllerで定義したメソッドは大抵子クラスのControllerのactionで使われたりfilterで使われたりするのが目的で、純粋にテストしようとしてもそれを継承したcontrollerありきのようなことが多い。そうなるとcontrollerのrequestテストの全てにそのbefore_actionが効いているのか?のテストを追加したくなってしまう。するとApplicationControllerを継承した全てのcontrollerで同じテストを追加しないといけないと考えてしまう。だがそんなテンプレテストを大量に作る意味はあるのだろうか。
ということでとりあえずそういうApplicationControllerの処理は適切な責務で切り、concernsを作ると良い。そんでconcernsのテストであればanonymous controllerを作成してそこにincludeし、機能の単体テスト(のようなもの)がかける。
あとはApplicationControllerでそのconcernsがincludeされることをテストする。これでApplicationControllerでconcerns(テストしたい機能)が実装されていることが保証できる。
ではあとは各controller側でApplicationControllerの当該処理が効いているかのテストを書こう!...というのは不要だろうというのが自分の考え。ApplicationControllerで実装されたbefore_actionなどが効いているかについては、あとはApplicationControllerが子controllerに継承されているかを確認すれば良いはず(hooksがApplicationControllerに実装されていることはすでにテスト済みで継承されれば発火することは保証できるので)。
だがApplicationControllerが子controllerに継承されていることを保証する必要がどれだけあるだろうか?各controllerごとに別のApplicationControllerを使っていれば必要かも知れないが、大抵はそうではないだろう。
大前提となっている部分(今回はApplicatoinControllerはcontrollerに継承されていること)に関してはいちいちテストにするにはやりすぎ、と判断して良いだろう。なのでApplicationControllerに実装した機能が各controllerで効いているかのテストとしてはこれで十分だろうと思う。