Функциональные тесты вложенных маршрутов на Rails 3 - PullRequest
2 голосов
/ 18 декабря 2010

У меня есть приложение Rails 3 со следующим вложенным маршрутом:

resources :games do
  collection do
    get :all
    get :unassigned
  end
  resources :messages
  resources :comments
end

В игре много комментариев, а в игре много сообщений.

Я ожидаю, что "/ games / 1 / comments" перенаправит действие index на контроллер комментариев и установит :game_id => 1 в хэше params.

В приложении все работает нормально. Однако мои тесты на маршруте не проходят, и я не могу понять, почему.

Когда я пытаюсь это сделать:

assert_routing({:path => "/games/1/messages", :method => :get},
  { :controller => "messages", :action => "index", :game_id => 1})

Я понял:

  2) Failure:
test_route_one(MessagesControllerTest)
    [actionpack (3.0.3) lib/action_dispatch/testing/assertions/routing.rb:52:in `assert_recognizes'
     actionpack (3.0.3) lib/action_dispatch/testing/assertions/routing.rb:120:in `assert_routing'
     test/functional/messages_controller_test.rb:106:in `test_route_one'
     activesupport (3.0.3) lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     activesupport (3.0.3) lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     activesupport (3.0.3) lib/active_support/callbacks.rb:438:in `_run_setup_callbacks'
     activesupport (3.0.3) lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
The recognized options <{"action"=>"index", "game_id"=>"1", "controller"=>"messages"}> 
did not match <{"action"=>"index", "game_id"=>1, "controller"=>"messages"}>, 
difference: <{"game_id"=>1}>

Когда я пытаюсь это сделать (обратите внимание на цитату на :game_id):

assert_routing({:path => "/games/1/messages", :method => :get},
  { :controller => "messages", :action => "index", :game_id => "1"})

Я получаю это:

  3) Failure:
test_route_two(MessagesControllerTest)
    [actionpack (3.0.3) lib/action_dispatch/testing/assertions/routing.rb:90:in `assert_generates'
     actionpack (3.0.3) lib/action_dispatch/testing/assertions/routing.rb:127:in `assert_routing'
     test/functional/messages_controller_test.rb:111:in `test_route_two'
     activesupport (3.0.3) lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     activesupport (3.0.3) lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     activesupport (3.0.3) lib/active_support/callbacks.rb:438:in `_run_setup_callbacks'
     activesupport (3.0.3) lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
found extras <{:game_id=>"1"}>, not <{}>

Также попробовал это:

assert_routing({:path => "/games/1/messages", :method => :get}, {:controller => "messages", :action => "index"}, {}, {:game_id => "1"})

Ответ:

The recognized options <{"action"=>"index", "game_id"=>"1", "controller"=>"messages"}> 
did not match <{"action"=>"index", "controller"=>"messages"}>, difference: <{"game_id"=>"1"}>

Думаю, что-то зациклился на синтаксисе проверки маршрутизации на вложенных ресурсах. Есть идеи?

Заранее спасибо -

Ответы [ 2 ]

5 голосов
/ 18 декабря 2010

Маршрутизация утверждения выполняет две вещи (в таком порядке)

  • assert_recognizes
  • assert_generates

Таким образом, ваш тестовый пример 2 получаетна шаг вперед / работает лучше.

Теперь assert_generates проверяет, возвращает ли url_for URL-адрес, который вы ему даете.

url_for(:controller => "messages", :action => "index", :game_id => "1")
# should return: /games/1/messages

Но согласно исключению, он возвращает /messages?game_id=1(game_id как дополнительный).Это должно / может произойти, только если у вас есть resources :messages правило до вашего resources :games.Если дело обстоит именно так, переместите его назад, чтобы первым было вложенное правило.

0 голосов
/ 18 декабря 2010

Попробуйте

assert_routing({:path => "/games/1/messages", :method => :get}, {:controller => "messages", :action => "index"}, {}, {:game_id => "1"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...