Функциональный тест Rails произвольных или настраиваемых URL-адресов

В моем приложении Rails есть ресурс RESTful под названием «Фото». Я использую скрепку для отображения разных «стилей» моих фотографий (для миниатюр и т.п. ), и я использую собственный маршрут для RESTful доступа к этим стилям:

map.connect "photos/:id/style/*style", :controller => "photos", :action => "show"

Это работает нормально, но я хочу написать тест, чтобы убедиться, что так и будет.

У меня уже есть функциональный тест для вызова действия show контроллера Photo (фактически сгенерированного scaffold):

test "should show photo" do
  get :show, :id => photos(:one).to_param
  assert_response :success
end

Это проверяет выполнение действия по URL-адресу "/ photo / 1". Теперь я хочу проверить выполнение URL "/ photo / 1 / style / foo". К сожалению, я не могу заставить ActionController :: TestCase попасть по этому URL-адресу; метод get всегда хочет действие / идентификатор и не принимает суффикс URL.

Как мне протестировать собственный URL-адрес?

Обновлять

Проверяя ответ @fernyb, я нашел этот фрагмент в том же rdoc

В тестах вы можете просто передать URL-адрес или именованный маршрут для получения или публикации. def send_to_jail get '/ jail' assert_response: success assert_template "тюрьма / интерфейс"

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

test "should get photo" do
  get "/photos/1/style/original"
  assert_equal( "image/jpeg", @response.content_type )
end  

ActionController::RoutingError: No route matches {:action=>"/photos/1/style/original", :controller=>"photos"}

Интересно, а я что-то не так делаю.


person Craig Walker    schedule 01.11.2009    source источник


Ответы (2)


Используйте assert_routing для проверки маршрутов:

assert_routing("/photos/10/style", :controller => "photos", :action => "show", :id => "10", :style => [])

assert_routing("/photos/10/style/cool", :controller => "photos", :action => "show", :id => "10", :style => ["cool"])

assert_routing("/photos/10/style/cool/and/awesome", :controller => "photos", :action => "show", :id => "10", :style => ["cool", "and", "awesome"])

Затем в своем интеграционном тесте вы можете:

test "get photos" do
   get "/photos/10/style/cool"
   assert_response :success
end
person fernyb    schedule 01.11.2009
comment
Это полезный материал, но на самом деле он не вызывает действия; он просто проверяет, приведет ли маршрутизация URL-адресов к определенному действию / параметрам. (Я отредактирую свой вопрос, чтобы уточнить, что я ищу). - person Craig Walker; 01.11.2009

Из документации Rails API:

Подбор маршрута

Указание *[string] как части правила, например:

map.connect '*path' , :controller => 'blog' , :action => 'unrecognized?'

скопирует все оставшиеся части маршрута, которые не были распознаны ранее. Глобальные значения находятся в params[:path] как массив сегментов пути.

Похоже, вам нужно передать :path аргумента, чтобы правильно протестировать действие.

person Matt Haley    schedule 01.11.2009
comment
Я думал об этом, но действительно надеялся избежать этого. Фактический вариант использования - это URL-адрес в определенном формате; передача сегментов пути в качестве параметра обходит эту проверку. - person Craig Walker; 01.11.2009
comment
Вы пытаетесь протестировать фреймворк? Когда вы `get / photos / 1 / styles / foo ', Rails должен проанализировать URL-адрес и вызвать контроллер. Вам не следует об этом беспокоиться, просто передайте ожидаемые параметры в действие, которое Rails вызовет. - person Matt Haley; 01.11.2009