Как определить действие по умолчанию для контроллера Rails? - PullRequest
1 голос
/ 13 апреля 2011

Я работаю над функциональным тестом, который должен утверждать, что определенный тег XHTML присутствует в определенном наборе контроллеров.Я в основном делаю это:

class ApplicationControllerTest < ActionController::TestCase
  def setup
    @controller = ApplicationController.new
  end
  # [...]
  def test_foo_bar_and_baz_include_stylesheet
    [FooController, BarController, BazController].each do |controller|
      @controller = controller.new
      get :show
      assert_select 'head > link[rel="stylesheet"]'
    end
  end
end

Проблема в том, что не все контроллеры имеют действие :show.Что мне нужно сделать, это спросить либо контроллер или конфигурацию маршрутизации для действия контроллера по умолчанию и вызвать get с этим.

Обновление: Джозеф Сильваши былправильно: я закончил тем, что разделил свой контроллер get на отдельные контрольные примеры.Решение проблемы маршрута «по умолчанию» было достаточно плохим, пока я не обнаружил, что к некоторым из моих маршрутов были присоединены условия, и мне пришлось бы их анализировать, чтобы создать правильный вызов get.И, наконец, функциональные тесты Rails не очень хорошо справляются с многократным вызовом get в одном и том же тестовом примере, особенно когда эти вызовы затрагивают несколько контроллеров.: (

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

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Контроллеры не имеют представления или действия «по умолчанию», кроме того, действия могут быть названы как угодно, они не должны быть стандартными index, show, new и т. Д.

Мне, вероятно, придется :get выполнить соответствующее действие для каждого контроллера, который вы хотите протестировать.Вполне вероятно, что каждый тест будет отличаться в будущем, хотя сейчас все они предъявляют одинаковые требования, я думаю, что имеет смысл написать один для каждого действия независимо от этого.

0 голосов
/ 13 апреля 2011

попробуйте использовать функцию response_to: http://www.ruby -doc.org / core / classes / Object.html # M001005 проверить метод exitst.

...