我这里有新的动作需要用户先登录到查看资源。 如果用户试图不被记录在创建新的资源,他们将被重定向(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浏览器。 重定向用户到登录页面?
谢谢。
难道作为文档说:
class ActionController::TestCase
include Devise::TestHelpers
end
尤其是,不要把include Devise::TestHelpers
成class
的ActiveSupport ::TestCase
。
这种情况发生在看守和/或制定夹杂物丢失或在适当的地方不加。 人们很容易将它们添加到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工作过。
我得到这个错误,但是那是因为我把我include Devise::TestHelpers
我的类定义之外。
require 'test_helper'
include Devise::TestHelpers
class Admin::ObservationsControllerTest < ActionController::TestCase
setup do
...
这扔监狱长误差为我7测试用例3。 移动include
类定义固定里面的一切。
我知道这是一个老问题,但现在我发现设计维基的答案
https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara
这有一个循序渐进的指南是太involde在这里重新创建,但是第一步是包括监狱长测试助手
include Warden::Test::Helpers
Warden.test_mode!
希望这可以帮助