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%.