的authenticate_user!与客人失败

时间:2014-12-08 17:05:29

标签: ruby-on-rails ruby rspec devise

我正在编写一个使用rspec进行设计和测试的rails应用程序。我有一个问题,当用户未登录时,我的rspec未通过user_authenticate。除了最后一个,我的所有规范都通过了 - 它给出的错误是

“失败/错误:get:show,id:course NoMethodError:undefined方法`authenticate'代表nil:NilClass”

我怀疑我遇到了这个问题,因为我有一个before_action:authenticate_user!呼叫,对于未登录的人,它会尝试验证nil。有没有办法让它优雅地失败并重定向到user_session?我尝试创建一个继承版本的authenticate_user来进行重定向,但它似乎不起作用。我知道这可能是一个noob问题,但我已经广泛搜索了没有任何解决方案。谢谢!

这是我的控制者:

class CoursesController < ApplicationController
    before_action :authenticate_user!, except: [:index]
    before_action :set_course, only: [:show]

    def index
        @course = Course.order('name')
    end

    def show
    end

    private

    def set_course
        @course = Course.find(params[:id])
    end

    def course_params
        params.require(:course).permit(:name,:description,:department,:hidden,
            :lecture_attributes => [:name,:description,:level])
    end

    def authenticate_user!
        if user_signed_in?
            super
        else
            redirect_to user_session
        end
    end

end

这是我的规范:

require 'rails_helper'

RSpec.describe CoursesController, :type => :controller do

    describe "user access " do
        before(:each) do
            @user = create(:user)
            @request.env['devise.mapping'] = Devise.mappings[:user]
            sign_in :user, @user
        end

        describe 'GET #index' do
            it 'renders the :index view' do
                get :index
                expect(response).to render_template :index
            end
        end

        describe 'GET #show' do
            it 'assigns the requested course to @course' do
                course = create(:course)
                get :show, id: course
                expect(assigns(:course)).to eq course
            end

            it 'renders the :show template' do
                course = create(:course)
                get :show, id: course
                expect(response).to render_template :show
            end
        end
    end

    describe "guest access " do
        describe 'GET #index' do
            it 'renders the :index view' do
                get :index
                expect(response).to render_template :index
            end
        end

        describe 'GET #show' do
            it 'redirects to the login url' do
                course = create(:course)
                get :show, id: course
                expect(response).to redirect_to 'user_session'
            end
        end
    end
end

2 个答案:

答案 0 :(得分:0)

当你添加:authenticate_user时,似乎设计重定向到“users#sessions”本身!对于未登录的访客或用户的show动作。

尝试删除自定义:authenticate_user!方法并将“only:[:show]”添加到您的before_action

class CoursesController < ApplicationController
  before_action :authenticate_user!, only: [:show], except: [:index]
  before_action :set_course, only: [:show]

  def index
      @course = Course.order('name')
  end

  def show
  end

  private

  def set_course
      @course = Course.find(params[:id])
  end

  def course_params
      params.require(:course).permit(:name,:description,:department,:hidden,
        :lecture_attributes => [:name,:description,:level])
  end

end

<强>更新

class CoursesController < ApplicationController
  before_action :authenticate_user!, except: [:index]
  before_action :set_course, only: [:show]

  def index
      @course = Course.order('name')
  end

  def show
      if user_signed_in?
           render :show
      else
           redirect_to user_session
      end
  end

  private

  def set_course
      @course = Course.find(params[:id])
  end

  def course_params
      params.require(:course).permit(:name,:description,:department,:hidden,
        :lecture_attributes => [:name,:description,:level])
  end

end

答案 1 :(得分:0)

这不是一个令人满意的结果,但它看起来好像是authenticate_user!没有正确使用rspec。当我直接加载页面时,它正确地重定向到登录页面,我仍然有兴趣知道正确的工作是什么。

我可以使用某种OR语句来首先检查用户是否存在吗?必须有一个标准的方法来处理这个问题,所以我可以确保我的应用程序正确重定向。