ruby-on-rails – 为未登录的用户测试重定向时的“uncaught throw:warden”

这是一个非常典型的控制器的规范,其中有一个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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...