Ruby on rails 如何测试嵌套资源';带Rspec的s控制器?
我的嵌套资源在模型和routes.rb中关联: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
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月编写此答案以来发生了变化,但谁能说呢?