【问题标题】:assert_routing bypasses warden/devise setupassert_routing 绕过warden/devise 设置
【发布时间】:2012-03-15 22:06:52
【问题描述】:

在我的 (Rails 3.2) Test::Unit 控制器/功能测试中,assert_routing 失败并出现此错误:

  1) Error:
test: with an admin user routing should route GET /admin/contracts to/from {:action=>"index", :controller=>"admin/contracts"}. (Admin::ContractsControllerTest):
NoMethodError: undefined method `authenticate!' for nil:NilClass

有路线:

authenticate :admin do
  namespace :admin do
    resources :contracts
  end
end

我正在控制器测试中设置 Devise 2.0 身份验证:

admin = Factory.create(:admin)
admin.confirm!
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in :admin, admin

这个答案Stubbing Warden on Controller Tests 表明机架可能在我的应用程序运行之前进行身份验证。这很奇怪,因为我的控制器测试正在运行并且应该已经设置了 env 变量。但是在调用 authenticate 时,request.env["warden"] 为 nil。

是这样吗,那个机架在 Devise 助手设置 env 变量之前就已经运行了吗?如果是这样,我如何在机架检查我的路由文件之前设置身份验证?我的其他断言通过了,但 assert_routing 似乎是一个特例。

编辑:

我在调用#authenticate 之前验证了我的设置正在运行,并且Devise 确实使用Warden::Proxy 对象初始化request.env['warden'],但是当调用#authenticate 时,`request.env['warden '] 为零。这是否意味着机架在单独的线程中运行或其他东西。如此混乱,我确定我做错了什么。 -_-

【问题讨论】:

标签: ruby-on-rails devise rack functional-testing warden


【解决方案1】:

控制器(功能)测试应该保持在控制器级别,并且不能访问较低级别的环境状态。所以 request.env['warden'] 在 Devise::TestHelper 中被模拟,以便控制器级别的测试可以通过,但是当 Rack 运行时 request.env 哈希为 nil 并且路由失败并出现上述错误。

这是在 routes.rb 中进行身份验证的优点和野兽:我们不必担心控制器级别的身份验证,但我们也不能在控制器级别测试我们的路由。至少目前不是(在 Rails 3.2 中),因为这是 Rails 的限制。

查看已关闭的问题https://github.com/plataformatec/devise/issues/1670

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2014-06-29
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多