在我的(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 助手设置环境变量之前运行?如果是这样,我如何在机架检查我的路由文件之前设置身份验证?我的其他断言通过了,但 assert_routing 似乎是一个特例。
编辑:
我验证了我的设置在调用#authenticate 之前正在运行,并且Devise 确实在用一个Warden::Proxy
对象初始化request.env['warden'],但是当调用#authenticate 时,`request.env['warden'] 为零。这是否意味着机架在单独的线程中运行或其他东西。如此混乱,我确定我做错了什么。-_-