クールな方法は無さそうだったので、望むようなsessionの状態を作るURLをテスト用にのみ公開するのが良いと考えた。例としてユーザーのログイン情報がセッション上にuser_idとして格納されている状態を作りたい場合:
routes.rb
if Rails.env.test? # こうしておけばテストでだけ使えるURLにできる
get 'test/user/session/:id', to: 'test#getSession'
post 'test/user/session/:id', to: 'test#userSession'
end
test_controller.rb
class TestController < ApplicationController
skip_before_filter :authorize
def userSession
user = User.find_by_id params[:id] # ここをidで取らない実装もあり得る
session[:user_id] = user.id
head :no_content
end
def getSession
render json: session # テストなのでセッション丸々返しても大丈夫だろう(いい加減)
end
end
test_spec.rb
require 'spec_helper'
describe 'create user' do
before do
@user = FactoryGirl.create(:user)
end
it "should" do
post "test/user/session/#{@user.id}" # postするとセッション情報作成できる
get "test/user/session/#{@user.id}" # getでセッション情報取得
ret = JSON.parse(response.body)
ret['user_id'].should == @user.id
end
end
もっと楽な方法を知っている人がいたら是非教えてください。