Как мне проверить, что before_filter будет перенаправлять все действия контроллера Rails? - PullRequest
4 голосов
/ 23 февраля 2011

У меня довольно типичный require_no_user как before_filter в одном из моих контроллеров. Мне нужно проверить, что вошедший в систему пользователь перенаправляется этим фильтром, если он пытается получить доступ к любому действий контроллера.

Есть ли разумный способ сделать это, не перечисляя все действия контроллера в моем тестовом примере?

Я пытаюсь избежать:

context 'An authenticated user' do
  setup do
    activate_authlogic
    @user = Factory(:user)
    UserSession.create(@user)
  do

  should 'not be allowed to GET :new' do
    get :new
    assert_redirected_to(root_path)
  end

  should 'not be allowed to POST :create' do
    # same as above
  end

  # Repeat for every controller action
end

1 Ответ

2 голосов
/ 23 февраля 2011

Не то, чтобы я знал ... хотя вы могли бы сделать его немного короче, упаковав все методы и действия в хеш:

should "be redirected" do
  {
    :get => :new,
    :post => :create,
  }.each do |method, action|
    send(method, action)
    assert_redirected_to(root_path)
  end
end

Редактировать: так что да, это, вероятно, излишне, но вот другой способ:

should "be redirected" do
  ActionController::Routing::Routes.named_routes.routes.each do |name, route|
    if route.requirements[:controller] == @controller.controller_name
      send(route.conditions[:method], route.requirements[:action])
      assert_redirected_to(root_path)
    end
  end
end

Кажется, однако, что если вы определяете несколько: методы в пользовательских маршрутах, он все еще только «находит» первый, например,

map.resources :foo, :collection => {
  :bar => [:get, :post]
}

Приведенный выше маршрут будет выполняться только с глаголом GET.

Также, если в URL есть другие требования, такие как наличие идентификатора записи, мой наивный пример игнорирует это требование. Я оставляю это на ваше усмотрение:)

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