2012-06-22 27 views
7

我有一个资源,其中新操作需要用户登录才能查看。如果用户尝试在未登录的情况下创建新资源,则会将其重定向(302'd)到登录页面。我的功能测试是这样的:在功能性Rails测试中为authenticate_user引发warden错误

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中那样行事。将用户重定向到登录页面?

谢谢。

+0

你有没有找到一种方法来测试在用户未登录的情况下?我有类似的问题。 –

+1

我不知道我是怎么最终得到了这个工作,但它可能会下降到加入“包括设计:: TestHelpers”来测试类。随意添加一个pastebin与你的代码,我会尝试看看。 – Ger

+0

在我的情况下,这原来是特征声明(我不需要,并在某种程度上导致此错误)'js:true' – xxjjnn

回答

0

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

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

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

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

希望这有助于

+1

这发生在我身上时,我有额外的逻辑绑在用户(他们需要由管理员批准,这在我的设计问题雷达中没有出现)。所以,即使用户有效,也要确保他们拥有所有正确的标志/权限才能看到页面。 – Danny

+0

看到我上面的答案。您还需要包含Warden.test_reset!在你的拆解函数中撤消测试结束时的任何变化。否则,在一个测试用例(例如登录)中执行的任何监督操作将会蔓延到下一个测试用例中。 – xeorem

2

这种情况发生在看守和/或开发ISE包裹丢失或在适当的地方不加。将它们添加到test_helper.rb中是很有诱惑力的,因为这通常是帮助者去的地方,但是这对Devise来说不能正常工作。

查看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工作过。

+3

你不需要在每个班级中都包含助手。您可以添加以下内容到您的test_helper中:'class ActionController :: TestCase include Devise :: TestHelpers include Warden :: Test :: Helpers end'(对于没有适当的空白的抱歉) – sbleon

+1

您的“答案”不包含一切工作。对不起,但这不是一个合适的答案,将所有的杂乱都包含在你的控制器中。 – wegginho

+2

由于这个原因,我遇到了这个问题,并且将'config.include Devise :: TestHelpers'从'spec_helper.rb'移动到'rails_helper.rb'解决了它(通过稍后在链中包含模块)。 –

1

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

require 'test_helper' 
include Devise::TestHelpers 

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

这引发了我的7个测试用例中的3个的warden错误。 在类定义里面移动include修复了一切。

相关问题