Tired of instantiating a def setup that logins a user for ever rspec controller that will require devise logins?
In order to DRY your login mechanisms in Devise:
- Create a external library that contains your various login strategies. I chose to put mine in /spec/support/controller_macros.rb. You can name the file anything you want. Make sure you modify the module name as well if you do so.
module ControllerMacros def login_admin @request.env["devise.mapping"] = Devise.mappings[:admin] user = FactoryGirl.build(:user) user.save!(:validate => false) user.add_role(:admin) sign_in user @current_user = user end def login_user @request.env["devise.mapping"] = Devise.mappings[:user] user = FactoryGirl.build(:user) user.save!(:validate => false) sign_in user @current_user = user end end
- Create a reference to it in your RSpec Helper
# spec/spec_helper.rb RSpec.configure do |config| config.include Devise::TestHelpers, :type => :controller config.include ControllerMacros, :type => :controller
- You’re done, now you can run login_user in any of your specs:
# some spec file it 'if question_option already exists, a new question_option should not be created' do login_user ...
I chose to do a config.include ControllerMacros instead of an config.extend as recommended in the source below because I’d like to explicitly tell each of my test cases whether to login or not.
Source: Devise Wiki