One way to make tests faster is to no load and submit the sign in form during the setup phase.
This back door inserts Rack middleware into a Rails app that uses Clearance:
# config/environments/test.rb class ClearanceBackDoor def initialize(app) @app = app end def call(env) @env = env sign_in_through_the_back_door @app.call(@env) end private def sign_in_through_the_back_door if user_id = params['as'] user = User.find(user_id) @env[:clearance].sign_in(user) end end def params Rack::Utils.parse_query(@env['QUERY_STRING']) end end MyRailsApp::Application.configure do # ... config.middleware.use ClearanceBackDoor # ... end
Then, include a user in an
as parameter in integration tests:
visit root_path(as: user)
It works for any URL:
visit new_feedback_path(as: giver)
This is like to Mislav’s approach except Rack middleware works with Rails routing constraints.
On one project using this technique, the total test suite time was reduced 23%.