Search code examples
ruby-on-railsrspecdeviserspec-rails

devise "user_signed_in?" method in rspec


I have a controller action which uses devise's "user_signed_in?" as a condition. The action looks like this:

 def show           
   if user_signed_in?
     #do stuff
   end
 end

But when I am testing this action in RSpec, the tests are failing because the code inside the if block never gets executed. Is there any way to stub the "user_signed_in?" method?


Solution

  • The code is not executed because the user is probably not signed in. To sign in a devise user in rspec, have this in spec/support/controller_macros.rb.

    module ControllerMacros
        def login_user
          before(:each) do
            @request.env["devise.mapping"] = Devise.mappings[:user]
            user = FactoryGirl.create(:user)
            user.confirm! #if you are using the "confirmable" module
            sign_in user
          end
        end
    end
    

    In spec/rails_helper.rb have this:

    RSpec.configure do |config|
      config.include Devise::Test::ControllerHelpers, :type => :controller
      config.extend ControllerMacros, :type => :controller
    end
    

    Then in your controller spec:

    describe MyController do 
      login_user
      ....
    end