设计在功能性的Rails测试抛出的authenticate_user监狱长错误(Devise war

2019-06-25 16:37发布

我这里有新的动作需要用户先登录到查看资源。 如果用户试图不被记录在创建新的资源,他们将被重定向(302'd)到登录页面。 我的功能测试是这样的:

  test "should not get new unless logged in" do
    get :new
    assert_response :redirect
  end

堆栈跟踪看起来是这样的:

ArgumentError: uncaught throw :warden
    /.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw'
    /.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!'
    /.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!'

我有一个的before_filter新的行动之前与authenticate_user。

我明白为什么的authenticate_user! 失败,但我不明白为什么它抛出一个错误。 难道不应该只是表现为它在webapp IE浏览器。 重定向用户到登录页面?

谢谢。

Answer 1:

难道作为文档说:

class ActionController::TestCase
  include Devise::TestHelpers
end

尤其是,不要把include Devise::TestHelpersclass 的ActiveSupport ::TestCase



Answer 2:

这种情况发生在看守和/或制定夹杂物丢失或在适当的地方不加。 人们很容易将它们添加到test_helper.rb中,因为这就是典型的助手去,但不会对设计正常工作。

见https://github.com/plataformatec/devise/issues/1029了解更多详情。

为了解决这个问题,包括制定助手和控制器的测试类这样的监狱长帮手两个:

require 'test_helper'                                  
class UserControllerTest < ActionController::TestCase  
  include Devise::TestHelpers                          
  include Warden::Test::Helpers                        
  Warden.test_mode!                                    

  def teardown                                         
    Warden.test_reset!                                 
  end                                                  

  # test "the truth" do                               
  #   assert true
  # end
end

这是必需的使用设计的验证每个控制器。

编辑:由于在下面的意见,提到移动include Warden:TestHelpers从spec_helper.rb(或test_helper.rb中),以rails_helper.rb工作过。



Answer 3:

我得到这个错误,但是那是因为我把我include Devise::TestHelpers我的类定义之外。

require 'test_helper'
include Devise::TestHelpers

class Admin::ObservationsControllerTest < ActionController::TestCase
  setup do
  ...

这扔监狱长误差为我7测试用例3。 移动include类定义固定里面的一切。



Answer 4:

我知道这是一个老问题,但现在我发现设计维基的答案

https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara

这有一个循序渐进的指南是太involde在这里重新创建,但是第一步是包括监狱长测试助手

include Warden::Test::Helpers
Warden.test_mode!

希望这可以帮助



文章来源: Devise warden error thrown for authenticate_user in functional Rails test