Search code examples
ruby-on-railsruby-on-rails-4rspecdevisebdd

RSpec & Devise authentication don't works


I having very weird problem with RSpec and Devise

  describe 'GET edit:/id' do 
    before do 
      @job = FactoryGirl.create(:job)
      get(:edit, id: @job.id)
    end

    context 'as not authorized' do
      before { logout(:user) }
      it 'redirects to login page' do
        expect(response).to redirect_to new_user_session_path
      end
    end

    #it '' do end << works if i uncomment this line

     context 'as authorized' do
      before { login_as(user) }
      it 'renders edit tempalte' do
        expect(response).to render_template :edit
       # Here I get response.status 302. It must be 200, controller thinks that user is not authorized.
       # But if add empty 'it' keyword, everything works fine
      end
    end
  end

Controller's before filter

before_filter :authenticate_user!, except: [:index, :show]

Solution

  • I don't know why everything works fine if add empty 'it' keyword.

    But, I know why context 'as authorized' doesn't work fine. I tried it and the code works fine.

    Spec file. I change 2 lines. Please look at comments.

    # spec/controllers/jobs_controller.rb
    require 'rails_helper'
    
    RSpec.describe JobsController, :type => :controller do
      describe 'GET edit:/id' do
        context 'as not authorized' do
          before do
            @job = FactoryGirl.create(:job)
            get(:edit, id: @job.id)
          end
          it 'redirects to login page' do
            expect(response).to redirect_to new_user_session_path
          end
        end
    
        context 'as authorized' do
          before do
            user = FactoryGirl.create(:user) # add here
            sign_in(user)  # change
            @job = FactoryGirl.create(:job)
            get(:edit, id: @job.id)
          end
    
          it 'renders edit tempalte' do
            expect(response).to render_template :edit
          end
        end
      end
    end
    

    Add Devise's test helpers to rails_helper.rb.

    # spec/rails_helper.rb
    # Add this line to provide Devise's test helpers
    # Ref: https://github.com/plataformatec/devise#test-helpers
    config.include Devise::TestHelpers, type: :controller
    

    Factory file.

    # spec/factories/users.rb
    FactoryGirl.define do
      factory :user do
        email 'test@email.com'
        password 'password'
      end
    end
    

    Run and success!!

    rspec spec/controllers/jobs_controller_spec.rb
    ..
    
    Finished in 0.09395 seconds (files took 2.31 seconds to load)
    2 examples, 0 failures