RSpec RailsのAnonymous controllerが便利

全ての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が実行されるのでその結果を見てテストしてあげればよいです。

参考サイト