全てのcontrollerでこのbefore_filterを実行したいという時によく継承元のApplicationControllerで実施することがあります
# -*- coding: utf-8 -*- class ApplicationController < ActionController::Base before_filter :check private def check redirect_to 'hoge' unless params[:iphone] end end
例えばiPhoneを持っていない人をリダイレクトさせるとか(特に他意はありません)
このテストを書きたい時テストをどこに書くかいつも悩んでいました。
どのcontrollerでも実装されるから、どこかで1回だけテストすればいいか→テストを書いた人且つ書いた時しか場所を覚えてない
どのcontrollerでも実行されるから、全部のcontrollerで一応試すか→冗長すぎる
そんな時Anonymous controllerの存在をしって解決することができました。
# -*- coding: utf-8 -*- require 'spec_helper' describe ApplicationController do controller do def index render text: 'iphone!!!!' end end describe 'check' do context 'iphoneの時' do before do get :index, iphone: 5 end it "iphone!!!!!" end context 'iphoneじゃない時' do before do get :index end it "リダイレクトされること" end end end
controllerブロック内にアクションを定義すると良い感じで定義してくれて
{"controller"=>"anonymous", "action"=>"index"}
というテスト用にcontrollerをでっちあげてくれます。
before_filterが実行されるのでその結果を見てテストしてあげればよいです。
参考サイト