Closed3

RSpec Request spec で session をモックする

daisaru11daisaru11

調べたが結局王道的な方法はよくわからない

大体次の方法のいずれかだろうか

なんだかまどろっこしいなと感じてしまったが、この辺りとか controller spec から request spec へ移行した流れをみると、内部はブラックボックスにして、ユーザーから見た挙動をテストせよということかもしれない?

本当は session をセットする action へリクエストした上で、テストするのが正しいのかもしれないが、今回はモックする方法で対処してしまう。

daisaru11daisaru11

こちらを参考にしつつ、 shared_context ではなく、 request spec 全てに include してしまう。

spec/support/session_helper.rb:

module SessionHelper
  class << self
    def included(base)
      base.instance_eval do
        let(:session) { {} }

        before do
          session_double = instance_double(ActionDispatch::Request::Session, enabled?: true, loaded?: false)

          allow(session_double).to receive(:[]) do |key|
            session[key]
          end
          allow(session_double).to receive(:[]=) do |key, value|
            session[key] = value
          end

          allow(session_double).to receive(:delete) do |key|
            session.delete(key)
          end

          allow(session_double).to receive(:clear) do |_key|
            session.clear
          end

          allow(session_double).to receive(:fetch) do |key|
            session.fetch(key)
          end

          allow(session_double).to receive(:key?) do |key|
            session.key?(key)
          end

          allow_any_instance_of(ActionDispatch::Request) # rubocop:disable RSpec/AnyInstance
            .to receive(:session).and_return(session_double)
        end
      end
    end
  end
end

spec/rails_helper.rb:

RSpec.configure do |config|
  ...
  config.include SessionHelper, type: :request

利用するときは、下記のように let で session のデータを定義する

let(:session) { { test: 1} }
このスクラップは2025/01/01にクローズされました