Функциональная проверка Rails произвольных или пользовательских URL - PullRequest
8 голосов
/ 01 ноября 2009

В моем приложении на 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 всегда хочет action / 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 ]

5 голосов
/ 01 ноября 2009

Используйте 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
1 голос
/ 01 ноября 2009

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

Маршрутное сглаживание

Указание *[string] как части Правило как:

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

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

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

...