Тестирование приложения Rails с помощью Rspec с использованием вспомогательного метода декларативной авторизации Allowed_to?

Я пытаюсь протестировать движок 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 -%>

person Robin    schedule 20.11.2011    source источник


Ответы (1)


Проблема в том, что у вас нет current_user, а этого ожидает declarative_authorization.

Попробуйте войти с помощью authlogic:

before(:each) do
    activate_authlogic
    UserSession.create Factory(:admin_user)
end

Это должно делать свое дело.

person tvdeyen    schedule 20.11.2011
comment
Я уже использовал authlogic в своих первых попытках... но декларативная авторизация не получает этого текущего пользователя при использовании permitted_to? Исключение такое же: неопределенная локальная переменная или метод `current_user' - person Robin; 20.11.2011