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

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

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

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

у меня уже есть функциональный тест для вызова показать действие контроллера фото (формируется на эшафот в факт):

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 всегда хочет действие/id и не принимает суффикс URL.

как я могу проверить пользовательский URL-адрес?

обновление

при проверке ответа @fernyb я нашел этот фрагмент в то же RDoc документации

в тестах вы можете просто передать URL или именованный маршрут, чтобы получить или опубликовать. def send_to_jail получить '/тюрьма' assert_response: успех 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"}

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

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

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

маршрут подстановка

задание *[string] как часть a правило вроде:

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

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

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