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メソッドの引数に、テスト対象のコントローラ名を入れるのがミソです。