Ruby on rails 如何测试嵌套资源';带Rspec的s控制器?

Ruby on rails 如何测试嵌套资源';带Rspec的s控制器?,ruby-on-rails,ruby,ruby-on-rails-3,rspec,rspec2,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: :sh

我的嵌套资源在模型和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"}

如何测试这些嵌套路由?

您可以使用
assert\u生成的
assert\u识别
assert\u路由
。比如说,

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

当您运行
rake routes
时,您应该看到嵌套的路由如下所示:

foo_bar GET    /foos/:foo_id/bars/:id(.:format)      bars#show
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
因此,需要两个参数来匹配此路由:
foo\u id
id
。由于您只提供
id
,因此无法找到路由

此外,对于在rspec中测试路由,您可能会发现使用内置的
路由到
匹配器比退回到
断言*
更有用,如下所示:

foo_bar GET    /foos/:foo_id/bars/:id(.:format)      bars#show
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

谢谢你,nkm,这是个有用的把戏。但对于嵌套路由,我似乎仍然无法使该断言为真。在上面的代码中,
{controller::bar,action::show,id:“1”}
看起来像是javascript方式,在ruby中是
{controller=>:bar,action=>:show,id=>“1”}
。但是从错误消息中显示没有匹配的路由。请确认已使用
rake routes
命令定义了相应的路由。@nkm您所称的“javascript方式”也可以称为Ruby 1.9方式。这些是等价的:
{:one=>123}
{one:123}
你是对的@Rob Davis,我没有意识到这一点。感谢更新(+1):)我看到有人投票否决了这个答案,但没有留下评论说明原因。也许是因为rspec语法自2012年2月编写此答案以来发生了变化,但谁能说呢?