ruby-on-rails – 为未登录的用户测试重定向时的“uncaught thro
这是一个非常典型的控制器的规范,其中有一个before_filter,当未登录的用户(例如客人)试图访问/ projects / new时,它会重定向到登录页面.
describe ProjectsController do (...) describe "GET new" do context 'when not logged in' do before { sign_in_nobody } context 'creating project' do before { get :new } it 'denies access' do expect(response).to be_redirect end end end end end 我已经列出了访问的所有可能结果:index,:show和:guest,guest,admins和superadmins.我既没有使用记录或访客用户,管理员也没有任何问题 – 但这实际上是这个规范第一次涉及涉及Devise的before_filter:autheticate_user的操作!它在那失败了. 正如您可能已经怀疑的那样 – 规范甚至没有达到预期(响应).对于be_redirect,它在之前引发了一个异乎寻常的拟合: Failures: 1) ProjectsController GET new when not logged in creating project denies access Failure/Error: get :new ArgumentError: uncaught throw :warden # ./spec/controllers/projects_controller_spec.rb:344:in `block (5 levels) in <top (required)>' 我已经搜索了一个问题的答案:“如何使用rspec和设计正确测试未经身份验证的(访客)用户”,但是每个人只讨论在设计中为RSpec实际记录用户时遇到问题. #spec/support/devise_authenticators.rb include Devise::TestHelpers def sign_in_nobody @request.env["devise.mapping"] = Devise.mappings[:user] sign_in User.new end def sign_in_user @request.env["devise.mapping"] = Devise.mappings[:user] sign_in FactoryGirl.create(:user) end 然而,这不是登录失败,这是“未登录”. 现在我正在使用一个解决方法: before { sign_in_nobody } context 'creating project' do it 'denies access' do expect{ get :new }.to raise_exception("uncaught throw :warden") end end 但即使它实际上是正确的(未捕获的抛出:warden只在authenticate_user!失败时发生,所以它可以用作期望)理论上它感觉真的很脏. 任何想法如何正确地做到这一点? (…也许我根本不应该测试这个,看看before_filter authenticate_user的正确性是Devise的责任不是我的?) 解决方法
它应该工作.我只花了一段时间修复同样的问题,结果证明我们有一个测试帮助程序,它会覆盖控制器测试的进程. Devise也会覆盖它来捕获:warden所以我只需要在包含默认的params模块之前包含Devise :: TestHelpers.
有关我在谈论过程时所说的内容的示例,请参阅this answer,其中介绍了如何将默认参数设置为包含格式:json (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |