Capybara,CanCan,Test vs. Dev

时间:2014-01-21 20:20:26

标签: ruby-on-rails rspec devise capybara cancan

我有一个带有Devise和CanCan的Rails 3.2应用程序。用户能力由角色定义。数据库中有五个角色,ID值为1-5,而User has_one角色通过成员资格。因此,例如,Membership.create(user_id: 2, role_id: 4)将导致User.find(2).role == Role.find(4) # => true

我的能力文件看起来像

if user.has_role? :admin
  can :manage, Model
  can :manage, AnotherModel
  # etc.
elsif user.has_role? :basic
  can :read, Model
  can :read, AnotherModel
elsif user.has_role? (etc. for other roles)
  (etc.)
else
  cannot :manage, :all

我想挑选那些试图访问未经授权的网页的人。我的应用程序控制器包括:

rescue_from CanCan::AccessDenied do |exception|
  reset_session
  redirect_to new_user_session_path
end

在开发中单击时,此行为正常工作 - 通过rails控制台创建的基本用户在尝试执行管理操作时被踢出,而没有角色的用户(在控制台中创建,然后User.last.membership.destroyUser.last.role # => nil)无法登录仪表板 - 而是立即将用户重定向到登录页面(没有角色的用户无法管理任何内容)。

我在尝试测试同样的行为时遇到了问题,特别是对于没有角色的用户:

# spec/support/login_helpers.rb
def login_via_sign_in_page(user)
  visit new_user_session_path
  fill_in :user_email, with: user.email
  fill_in :user_password, with: user.password
  click_button 'Sign in'
end

# spec/features/dashboard_spec.rb
describe "as a user with no role" do
  let(:user) { FactoryGirl.create(:user) }

  before { login_via_sign_in_page(user) }

  it "should redirect to the sign_in page" do
    current_path.should == new_user_session_path
  end
end

上述测试失败,RSpec显示用户已成功将其设置到仪表板页面,而不是重定向到登录页面。但是,以下规范确实通过了:

# spec/features/dashboard_spec.rb
describe "as a guest browser (no login whatsoever)" do
  it "should redirect to the sign_in page" do
    visit dashboard_index_path
    current_path.should == new_user_session_path
  end
end

describe "as an admin user" do
  let(:user) { FactoryGirl.create(:admin_user) }

  before { login_via_sign_in_page(admin_user) }

  it "should go to the dashboard" do
    visit dashboard_index_path
    current_path.should == dashboard_index_path
  end
end

...以及在尝试管理操作时将基本用户重定向到sign_in页面

我看过this post,似乎正在处理类似的问题,但那些建议没有帮助。

最后,在使用debuggersave_and_open_page时,我得到了令人困惑的结果。前者会给我user # => <A legit User object>user.role # => nil。但是,save_and_open_page显示我已在仪表板页面上登录。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用Warden::Test::Helpers以及测试Devy with Capybara所需的其余配置?看看How To: Test with Capybara。你在用哪个司机?