assert_routing绕过warden / devise设置

时间:2012-03-13 05:43:51

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

在我的(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变量。但在调用身份验证时,request.env["warden"]为零。

是不是这样,在Devise助手设置env变量之前该机架正在运行?如果是这样,如何在机架检查我的路由文件之前设置身份验证?我的其他断言传递,但assert_routing似乎是一个特例。

修改

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

1 个答案:

答案 0 :(得分:1)

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

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

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