如何使用Rspec测试嵌套资源的控制器?

时间:2012-02-10 02:32:54

标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec2

我的嵌套资源在模型和routes.rb中关联:

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"}

如何测试这些嵌套路线?

2 个答案:

答案 0 :(得分:3)

您可以将assert_generatesassert_recognizesassert_routing用于testing routes。例如,

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

答案 1 :(得分:2)

当你运行rake routes时,你应该看到你的嵌套路线看起来像这样:

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

因此需要两个参数来匹配此路线:foo_idid。由于您只提供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