Rails功能测试与登录用户(未定义的方法'会话')

时间:2013-12-09 23:53:05

标签: ruby-on-rails ruby-on-rails-3 session rspec omniauth

我正在使用rspec编写功能规范,并希望每次都跳过登录步骤。用户通过omniauth(无设计)进行身份验证,并设置session[:user]变量,然后引用以保持登录状态。我希望能够直接设置会话变量:

require 'spec_helper'

describe "My page" do
  it "has what I want on it when logged in" do
    user = FactoryGirl.create(:user)
    session[:user] = user.id
    visit my_path
    page.should have_content "Foobar"
  end
end

但这给出了

 Failure/Error: session[:user] = user.id
 NameError:
   undefined local variable or method `session' for #<RSpec::Core::ExampleGroup::Nested_1:0x007fd13456d170>

有没有办法直接设置会话变量,以便在大多数测试中避免登录步骤?

2 个答案:

答案 0 :(得分:9)

rack_session_access gem似乎运作良好: https://github.com/railsware/rack_session_access

有了它,测试成为:

require 'spec_helper'

describe "My page" do
  it "has what I want on it when logged in" do
    user = FactoryGirl.create(:user)
    page.set_rack_session(user: user.id)
    visit my_path
    page.should have_content "Foobar"
  end
end

答案 1 :(得分:0)

如果这是控制器规范,您可以按如下方式模拟登录:

request.session[user_id] = user.id

How do I simulate a login with RSpec?所示。但是,由于这是一个功能规范,我不相信直接设置会话。