rspecでsessionにデータを入れてテストしたいシーンがあるかと思います。
ぱっと調べた感じだと方法が古いのか上手くいかないものが多かったので、動くものを備忘録として記事化しようと思います。
環境
| Service | Version |
|---|---|
| Ruby | 3.3.2 |
| Ruby on Rails | 7.1 |
| rspec-rails | 6.1.3 |
対応内容
supportファイルの有効化
もし有効化していなければ有効化してください。
spec/rails_helper.rb
- # Rails.root.glob('spec/support/**/*.rb').sort.each { |f| require f } + Rails.root.glob('spec/support/**/*.rb').sort.each { |f| require f }
Session用のサポートファイル作成
spec/support/session.rb
shared_context 'session double' do let(:session_hash) { {} } before do session_double = instance_double(ActionDispatch::Request::Session, enabled?: true, loaded?: false) allow(session_double).to receive(:[]) do |key| session_hash[key] end allow(session_double).to receive(:[]=) do |key, value| session_hash[key] = value end allow(session_double).to receive(:delete) do |key| session_hash.delete(key) end allow(session_double).to receive(:clear) do |_key| session_hash.clear end allow(session_double).to receive(:fetch) do |key| session_hash.fetch(key) end allow(session_double).to receive(:key?) do |key| session_hash.key?(key) end allow_any_instance_of(ActionDispatch::Request) .to receive(:session).and_return(session_double) end end
使い方
以下のようにsession_hashに値を設定してあげれば、それがそのままsessionとなる。
let(:session_hash) { { sample: :value } }
感想
新規案件始めるたびに忘れる。 ので記事化。
参考
Set Session in RSpec with Rails 7 API
備忘録のためにここに書いていることを日本語にしただけです。