Step 1:
You can create custom methods like following in spec folder and then simply use them (after you have done what @Mohammad AbuShady's answer states which usually is done by default in rspec)
module ControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in FactoryBot.create(:user, admin:true)
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in FactoryBot.create(:user)
end
end
end
Step 2:
Add login_user or login_admin to your spec file wherever you need and change
let(:valid_session) { {} }
to
let(:valid_session) { {"warden.user.user.key" => session["warden.user.user.key"]} }
I hope you are using devise and warden which are really useful if you don't want to worry about session/login/signup issues.
You can see their documentations here:
plataformatec/devise
wardencommunity/warden
This answer was written based on documentation of devise:
devise-wiki-how-to-test