RackSessionAccess provides rack middleware for 'rack.session' environment management.
Acceptance testing assumes that you can't directly access an applications session. For example, if you use capybara with selenium webdriver you can't change some session values because your tests use the same browser that accesses the application(via the backend server).
But what if you still want to change session values? One possible solution is to inject into the application some code that will manage the session independently. If you use rack based framework this gem does it!
geminstallrack_session_accessAdd to Gemfile:
gem'rack_session_access'Add RackSessionAccess middleware to rails middleware stack.
Add the following inconfig/environments/test.rb:
[MyRailsApp]::Application.configuredo |config|
...
# Access to rack sessionconfig.middleware.useRackSessionAccess::Middleware
...
endNote Ensure you include rack_session_access middleware only for test environment otherwise you will have security issue.
Add to your sinatra application:
classMySinatraApplication < Sinatra::Baseenable:sessionsuseRackSessionAccessifenvironment == :test
...
endIf you use rspec you may prefer to inject middleware only for rspec tests:
Put into spec/spec_helper:
MySinatraApplication.configuredo |app|
app.useRackSessionAccess::MiddlewareendRack::Builder.newdo
...
useRack::Session::CookieuseRackSessionAccess::MiddlewareuseMyRackApplicationend.to_appAdd to spec/spec_helper.rb
require"rack_session_access/capybara"Use:
page.set_rack_sessionto set your desired session datapage.get_rack_sessionto obtain your application session datapage.get_rack_session_keyto obtain certain key if your application session data
Example:
require'spec_helper'feature"My feature"dogiven!(:user){create(:user,email: 'jack@daniels.com')}scenario"logged in user access profile page"dopage.set_rack_session(user_id: user.id)visit"/profile"expect(page).tohave_content("Hi, jack@daniels.com")endscenario"visit landing page"dovisit"/landing?ref=123"expect(page.get_rack_session_key('ref')).toeq("123")endendmoduleFeatureHelpersdeflogged_as(user)page.set_rack_session('user_credentials'=>user.persistence_token)endendmoduleFeatureHelpersdeflogged_as(user)page.set_rack_session('warden.user.user.key'=>User.serialize_into_session(user).unshift("User"))endendPut corresponding implementation of logged_as in spec/support/feature_helpers.rb and include module into rspec config:
RSpec.configuredo |config|
...
config.includeFeatureHelpers,type: :feature...
endStart your scenarios with already logged in user:
feature'User dashboard',type: :featuredogiven(:user){create(:user)}backgrounddologged_asuserendscenario'User reviews a dashboard'do
...
endendThus we use marshalized data it's possible to set any ruby object into application session hash.
Enjoy!
bundle install
bundle exec rspec -fd spec/BUNDLE_GEMFILE=Gemfile.rails3 bundle install
BUNDLE_GEMFILE=Gemfile.rails3 bundle exec rspec -fd spec/- Copyright (c) 2015 Railsware www.railsware.com
- MIT