Rspec request specでセッションの読み込み、書き込みを実現してみる
今回はActionDispatch::Requestのsessionメソッドを上書きする形で対応します
allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return({})
事前にセッションを書き込む方法
rails_helper.rb
に上記のsessionメソッド上書きを実装します
rails_helper.rb
RSpec.configure do |config|
# ...
# テストケース共通の事前処理
config.before(:each) do
# let(:rspec_session) で指定された値を セッションの初期値とします
session = defined?(rspec_session) ? rspec_session : {}
# destroyメソッドを実行してもエラーにならないようにします(必要であれば)
session.class_eval { def destroy; nil; end }
# sessionメソッドを上書き
allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(session)
end
end
以下のように テストコード内の変数でセッションの初期値を設定できます
let(:rspec_session) { { user_id: 1 } }
事前にセッションを書き込む&実行後のセッションを取得する方法
config.add_setting()
を使用し、session変数をグローバルで扱えるようにします
上記の rails_helper.rb
に更に追記します
rails_helper.rb
RSpec.configure do |config|
# ...
# テストケース共通の事前処理
config.before(:each) do
# let(:rspec_session) で指定された値を セッションの初期値とします
session = defined?(rspec_session) ? rspec_session : {}
# destroyメソッドを実行してもエラーにならないようにします(必要であれば)
session.class_eval { def destroy; nil; end }
# 追記 実行後のセッションを取得できるようにする
config.add_setting(:session, :default => session)
# 変更 sessionメソッドをRSpec.configuration.sessionで上書き
allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(RSpec.configuration.session)
end
end
テスト実施後に RSpec.configuration.session
を取得することで、実行後のセッションを確認できます
expect(RSpec.configuration.session[:user_id]).to eq 1
参考にしました
Method: RSpec::Core::Configuration#add_setting
いいね!と思ったら LGTMお願いします👍