使用Session测试Rails控制器

时间:2014-06-23 12:07:07

标签: session testing ruby-on-rails-4 rspec controller

在我的应用程序中,我有一个会话控制器。现在我想测试用户控制器,只有登录后才能访问。

我的问题是如何伪造会话。我已经尝试了很多,所以我希望你现在可以帮助我:

应用程序控制器:

   helper_method :current_user
   def authenticate_user
     current_user
     if @current_user
       return true
     else
       redirect_to(:controller => 'sessions', :action => 'new')
       return false
     end
   end

   private
     def current_user
     @current_user ||= User.find(session[:user_id]) if session[:user_id]
   end

用户控制器具有:

before_filter :authenticate_user

控制器测试:

describe "GET index" do
  it "assigns all users as @users" do
    user = FactoryGirl.create(:user)
    @request.session[:user_id] = user.id
    get 'users'
    expect(@users.size).to eq(1)
  end
end

我也尝试了session[:user_id] = user.id并调试(在获取请求之后):

  • save_and_open_page让我看到登录页面。
  • @current_user永远是
  • User.find(session[:user_id])返回正确的用户

1 个答案:

答案 0 :(得分:4)

尝试使用controller代替@request

user = FactoryGirl.create(:user)
controller.session[:user_id] = user.id
get 'users'
expect(@users.size).to eq(1)

您是否在测试中定义了@users变量?可能应该是expect(User.count).to eq(1)