2012-02-10 2 views
2

Мой вложенная ресурс связаны в моделях и routes.rb:Как проверить контроллер вложенного ресурса с помощью Rspec?

resources :foos do 
    resources :bars 
end 

Мое приложение маршрутизации в порядке, но я не могу доказать никаких утверждений о моих вложенных маршрутов:

describe BarsController do 

it "should have a route to 'show'" do 
    assert_generates "/foos/bars/1", 
        {controller: :bars, action: :show, id: "1"} 
end 

Здесь ошибка:

Failure/Error: assert_generates "/foos/bars/1", 
ActionController::RoutingError: 
No route matches {:controller=>"bars", :action=>"show", :id=>"1"} 

Как проверить эти вложенные маршруты?

+0

сообщения ошибки, пожалуйста. –

+0

Счастье, Срдджан. Благодарю. – eeeeeean

ответ

2

При запуске rake routes вы увидите, что ваши вложенные маршруты выглядеть примерно так:

foo_bar GET /foos/:foo_id/bars/:id(.:format)  bars#show 

Таким образом, два параметра должны соответствовать этому маршруту: foo_id и id. Поскольку вы только поставляете id, он не может найти маршрут.

Кроме того, для тестирования маршрутов в RSpec, вы можете найти его более полезным использовать встроенные в routes_to согласованях вместо того, чтобы падать обратно assert_*, как это:

it "routes to the 'show' action" do 
    { get: "/foos/123/bars/456" }. 
    should route_to controller: "bars", 
     action: "show", 
     foo_id: "123", 
     id: "456" 
end 
+0

Я вижу, что кто-то проголосовал за этот ответ, но не оставил комментариев, чтобы сказать почему. Может быть, это потому, что синтаксис rspec изменился с февраля 2012 года, когда этот ответ был написан, но кто может сказать? –

3

Вы можете использовать assert_generates, assert_recognizes и assert_routing для testing routes. Например,

assert_generates "/foo/bar/1", 
    { :controller => "bar", :action => "show", :id => "1" } 
+0

Спасибо, nkm, за полезный трюк. Но я все еще не могу утверждать, что это утверждение верно для вложенного маршрута. Отредактировано выше. – eeeeeean

+0

В вышеприведенном коде '{controller:: bars, action:: show, id:" 1 "}' похоже на javascript, в ruby ​​это '{controller =>: bars, action =>: show, id => "1"} '. Но из сообщения об ошибке не указаны соответствующие маршруты. Подтвердите, что соответствующий маршрут был определен с помощью команды «rake routes». – nkm

+1

@nkm, что вы называете «способ javascript», также можно назвать способом Ruby 1.9. Они эквивалентны: '{: one => 123}' и '{one: 123}' –

Смежные вопросы