assert_routing обходит установку надзирателя / разработки - PullRequest
2 голосов
/ 13 марта 2012

В моем (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

Я устанавливаюup Проверка подлинности Devise 2.0 в тестах моего контроллера:

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

Этот ответ Stubbing Warden при тестировании контроллера указывает, что стойка может проходить проверку подлинности даже до запуска моего приложения.Что странно, потому что мои тесты контроллера выполняются и уже должны были установить переменную env.Но в то время, когда аутентификация вызывается, request.env["warden"] равен нулю.

Это тот случай, когда стойка работает до того, как помощник Devise установит переменную env?И если да, то как настроить аутентификацию до того, как стойка проверит мой файл маршрутизации?Мои другие утверждения проходят, но assert_routing представляется особым случаем.

edit:

Я проверил, что моя установка запущена до вызова #authenticate и Devise isдействительно, инициализируем request.env ['warden'] с помощью объекта Warden::Proxy, но когда вызывается #authenticate, `request.env ['warden'] равен nil.Означает ли это, что стойка работает в отдельном потоке или что-то в этом роде?Так запутанно, я уверен, что делаю что-то не так.-_-

1 Ответ

1 голос
/ 14 марта 2012

Тесты контроллера (функциональные) должны оставаться на уровне контроллера и не иметь доступа к состоянию среды более низкого уровня.Так что request.env['warden'] проверяется в Devise :: TestHelper, так что тесты уровня контроллера могут пройти, но когда Rack запускает хэш request.env, равный nil, и маршрут завершается ошибкой с указанной выше ошибкой.

Это красота изверь аутентификации в route.rb: нам не нужно беспокоиться об аутентификации на уровне контроллера, но мы также не можем тестировать наши маршруты на уровне контроллера.По крайней мере, на данный момент (в Rails 3.2) это ограничение Rails.

См. Закрытый выпуск https://github.com/plataformatec/devise/issues/1670

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...