【发布时间】: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 '] 为零。这是否意味着机架在单独的线程中运行或其他东西。如此混乱,我确定我做错了什么。 -_-
【问题讨论】:
-
我可能已经发现这是一个 Rails 限制,通过这个已关闭的设计问题:github.com/plataformatec/devise/issues/1670 我已经向 Jose Valim 询问了确认。
标签: ruby-on-rails devise rack functional-testing warden