7

我有一个资源,其中新操作需要用户登录才能查看。如果用户在未登录的情况下尝试创建新资源,他们将被重定向(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 来验证用户。

我明白为什么要进行身份验证用户!失败了,但我不明白为什么它会抛出错误。它不应该像在 webapp 中那样运行吗?将用户重定向到登录页面?

谢谢。

4

4 回答 4

5

按照文档说的做:

class ActionController::TestCase
  include Devise::TestHelpers
end

特别是,不要include Devise::TestHelpers放入classActiveSupport::TestCase

于 2015-04-23T22:34:33.223 回答
2

当 Warden 和/或 Devise 内含物丢失或未添加到正确位置时,就会发生这种情况。将它们添加到 test_helper.rb 是很诱人的,因为这是助手通常会去的地方,但对于 Devise 来说不能正常工作。

有关更多详细信息,请参阅https://github.com/plataformatec/devise/issues/1029

要解决此问题,请在控制器的测试类中同时包含 Devise 助手和 Warden 助手,如下所示:

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

这对于使用 Devise 身份验证的每个控制器都是必需的。

编辑:正如下面评论中提到的,include Warden:TestHelpers从 spec_helper.rb(或 test_helper.rb)移动到 rails_helper.rb 也可以。

于 2013-12-22T02:05:31.060 回答
1

我收到了这个错误,但这是因为我把我include Devise::TestHelpers的类定义放在了外面。

require 'test_helper'
include Devise::TestHelpers

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

这为我的 7 个测试用例中的 3 个抛出了守望者错误。移动include类定义内部修复了一切。

于 2016-07-27T15:46:50.010 回答
0

我知道这是一个老问题了,但我找到了 Devise wiki 的答案

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

这有一个分步指南,无法在此处重新创建,但第一步是包含 Warden 测试助手

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

希望这可以帮助

于 2013-07-23T17:42:12.033 回答