Skip to content

Instantly share code, notes, and snippets.

@jsugarman
Last active May 16, 2024 05:28
Show Gist options
  • Save jsugarman/103d44830eb49f7acdd872919661a4f9 to your computer and use it in GitHub Desktop.
Save jsugarman/103d44830eb49f7acdd872919661a4f9 to your computer and use it in GitHub Desktop.
RSpec request spec session double
# Idea from
# https://github.com/DFE-Digital/schools-experience/blob/master/spec/support/session_double.rb
#
RSpec.shared_context "with session double" do
let(:session) { session_double }
let(:session_double) { instance_double(ActionDispatch::Request::Session, enabled?: true, loaded?: false, id: SecureRandom.hex) }
let(:session_hash) { {} }
before do
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
# rubocop:disable RSpec/AnyInstance
allow_any_instance_of(ActionDispatch::Request)
.to receive(:session).and_return(session_double)
# rubocop:enable RSpec/AnyInstance
end
end
# Usage
#
describe "GET /some/path/to/action" do
subject(:get_request) { get some_path_to_action_path(some_argument) }
include_context "with session double"
before do
session[:some_expected_session_var] = "some_value"
end
it "does what we expect" do
get_request
expect(response).to have_http_status(:ok)
expect(response.body).to include("some_value")
...
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment