megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

Rspecでsessionにダミーデータを入れたい

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

備忘録のためにここに書いていることを日本語にしただけです。