Closed3
RSpec Request spec で session をモックする
session を扱う action のテストで、 session にあらかじめデータを入れておきたい。
調べたが結局王道的な方法はよくわからない
- https://gist.github.com/dteoh/99721c0321ccd18286894a962b5ce584
- https://megu-tech.hatenablog.com/entry/2024/07/04/144548
大体次の方法のいずれかだろうか
- session をセットする action へリクエストした上で、対象の action をテストする
- ActionDispatch::Request::Session をモックする
- gem を使う
なんだかまどろっこしいなと感じてしまったが、この辺りとか controller spec から request spec へ移行した流れをみると、内部はブラックボックスにして、ユーザーから見た挙動をテストせよということかもしれない?
本当は session をセットする action へリクエストした上で、テストするのが正しいのかもしれないが、今回はモックする方法で対処してしまう。
こちらを参考にしつつ、 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にクローズされました