Ошибка аутентификации во время функциональных тестов - PullRequest
1 голос
/ 05 июля 2011

У меня есть приложение Ruby on Rails, над которым я работаю, и у меня возникли некоторые проблемы с моими функциональными тестами. В частности, я продолжаю получать отказ в доступе во время моих тестов к страницам, доступ к которым возможен в браузере при входе через пользователя с похожими учетными данными (одинаковые роли и т. Д.). Например, вот код из теста для контроллера:

include Devise::TestHelpers
include Authorization::TestHelper
...
setup do
  @user = Factory(:user)
  @user.roles << Factory(:refinery_role)
  @user.roles << Factory(:agency_role)
  @user.save
  sign_in @user

  @agency = AgencyOrganization.create :name => "Test Agency"

  @adv1 = AdvertiserOrganization.create :name => "Test Advertiser", :parent => @agency

  UserOrganization.create :user_id => @user.id, :organization_id => @agency.id
end

test "agency user can edit advertiser" do
  assert @user.has_role? :agency #passes
  should_be_allowed_to :update, :advertiser_organizations #passes

  get :edit, {:id => @adv1.id}, {:agency_id => @agency.id}

  assert_equal "/unauthorized", request.env['PATH_INFO'] #passes :'(
  assert_template :edit #fails
  # and more tests we never get to
end

(Очевидно, это не все утверждения, которые я действительно хочу проверить, но они демонстрируют, что происходит.)

Для того, чтобы это стоило, вышеупомянутый тест терпит неудачу со следующим поднятым исключением:

4) Failure:
test_agency_user_can_edit_advertiser(AdvertiserOrganizationsControllerTest [/Users/gworley/.rvm/gems/ruby-1.9.2-p180@portal/gems/declarative_authorization-0.5.1/lib/declarative_authorization/maintenance.rb:170]:
Exception raised:
<#<Authorization::NotAuthorized: No matching rules found for update for #<Authorization::GuestUser:0x00000101cda2b0 @role_symbols=[:guest]> (roles [:guest], privileges [:update, :manage], context :advertiser_organizations).>>.

Опять же, как я уже сказал, все работает, когда вы на самом деле запускаете приложение, оно просто заставляет работать тесты (хотя, может быть, приложение работает только случайно, кто знает?).

Ответы [ 4 ]

1 голос
/ 27 августа 2011

Не забудьте установить Authorization.current_user, иначе DA не будет знать, кто вошел в систему

  def current_user
    @controller.current_user
  end
  def with_sign_in(u)
    sign_in u
    Authorization.current_user = current_user 
    yield
    sign_out u
    Authorization.current_user = nil
  end
1 голос
/ 19 июля 2011

Это выстрел в темноте, потому что я не использую Devise в своем приложении, но система аутентификации, которую мы используем, имеет такую ​​особенность, что она просто устанавливает :user_id в сеансе, который сжимается хэшем сеансав тесте.

Я заметил, что ваш метод теста устанавливает :agency_id в сеансе.

Попробуйте полностью удалить хэш сеанса и посмотрите, заменяется ли полученная вами ошибка ошибкой, связанной с отсутствием.:agency_id, а не ошибка аутентификации, или добавьте в хеш любую переменную сеанса, которую Devise использует для аутентификации.

1 голос
/ 13 июля 2011

Вы пропали без вести в настройке request.env["devise.mapping"] = Devise.mappings[:user]

Посмотрите Devise wiki для получения дополнительной информации.Лично я бы выделил эту функцию входа в систему в отдельный модуль и включил бы ее по запросу.т.е. login_user / login_agency_user

0 голосов
/ 19 июля 2011

Это аутентификация (кто вы) или авторизация (что вам разрешено делать), которая терпит неудачу?Если авторизация не удалась, возможно, это проблема с гемом Declarative_authorization, который вы используете.Если это проблема аутентификации, то это, вероятно, проблема с гемом Devise или Devise TestHelpers.Этот похожий вопрос может быть полезным.Если ничего не работает, то также возможно отключить аутентификацию, как это

  before :each do
    @current_user = Factory(:user)
    controller.stub!(:current_user).and_return(@current_user)
    controller.stub!(:user_signed_in?).and_return(:true)
    controller.stub!(:authenticate_user!).and_return(:true)
  end
...