Edited at

Railsでコントローラのprivateメソッドをテストする

More than 5 years have passed since last update.

privateメソッドをテストしなくてはいけない、というのは行儀的には悪いことではありますが、必要に迫られた際にはRSpecのAnnonymousControllerという機能を使ってテストすることができます。

Ref: https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs/anonymous-controller

YourController#smartphone_view?というメソッドがprivateメソッドだとして、その返り値をテストしたい場合は、以下のように書くことができます。

describe YourController do

describe '#smartphone_view?' do
controller(YourController) do
def index
@result = smartphone_view?
render text: 'ok'
end
end

subject { assigns(:result) }

context 'PCからのアクセス' do
before do
get :index
end
it { should be_false }
end
context 'スマホからのアクセス' do
before do
Rack::Request.any_instance.stub(:smart_phone?).and_return(true)
get :index
end
it { should be_true }
end
context 'ガラケーからのアクセス' do
before do
Rack::Request.any_instance.stub(:mobile?).and_return(true)
get :index
end
it { should be_true }
end
end
end

controllerメソッドの引数に、テスト対象のコントローラ名を入れるのがミソです。