Я пытаюсь протестировать движок rails с помощью rspec, где я использую гем declarative_authorization для управления ролями для своих пользователей. UserSessions управляются Authlogic.
В моем тесте я вызываю вспомогательный метод, который частично визуализирует представление. В этом частичном я использую permitted_to? do ... end
метод декларативной авторизации.
Я ожидаю получить ответ со строкой html.
Проблема в том, что permitted_to?
выдает исключение:
неопределенная локальная переменная или метод `current_user' для #
Я внимательно изучил модуль декларативной аутентификации AuthorizationInController (для которого требуется авторизация.rb, где метод current_user определен как метод класса) и обнаружил, что метод current_user вызывается из options_for_permit, который вызывается из allow_to?.
Когда я изменяю :user => current_user
в методе options_for_permit на :user => Authorization.current_user
, исключение исчезает, и мой тест проходит.
Я не очень хорошо разбираюсь в Rubyist, поэтому не знаю, правильный ли это способ решить эту проблему. Метод разрешён_к? является фундаментальным методом declarative_authorization, поэтому я не знаю, почему он работает при обычном использовании, а не при использовании здесь, в тесте.
мои вопросы:
- Является ли это ошибкой в декларативной авторизации?
- Может ли мое исправление повлиять на другие области?
Надеюсь, жду вашего ответа...
спасибо робин
РЕДАКТИРОВАТЬ:
Я только что заметил, что мое приложение больше не работает правильно с моими изменениями в среде разработки.
Authorization.current_user теперь является Authorization::AnonymousUser, в то время как current_user является действительным пользователем с ролью администратора...
Заглушка current_user не работает, это то, что я пробовал сначала.
Мой тестовый код:
it "should render the main navi for all core modules" do
main_navi = YAML.load_file(File.join(Rails.root, "../..", "config/alchemy", "modules.yml"))
helper.stub(:alchemy_modules).and_return(main_navi)
Authorization.current_user = Factory(:admin_user)
helper.admin_main_navigation.should have_selector('a.main_navi_entry')
end
код просмотра, который должен отображаться:
<%- permitted_to?(
:index,
:admin
) do -%>
...
<%- end -%>