如何使用Rspec测试具有嵌套路由的控制器?

我有两个控制器,我使用铁轨脚手架发电机创建。 我希望它们嵌套在一个名为“demo”的文件夹中,然后运行

rails g scaffold demo/flows rails g scaffold demo/nodes 

然后我决定在流内嵌套节点,并改变我的路由文件,如下所示:

 namespace :demo do resources :flows do resources :nodes end end 

但是这种变化导致了对节点的rspec测试破坏了ActionController :: Routing错误。

  15) Demo::NodesController DELETE destroy redirects to the demo_nodes list Failure/Error: delete :destroy, :id => "1" ActionController::RoutingError: No route matches {:id=>"1", :controller=>"demo/nodes", :action=>"destroy"} 

问题是rspec正在寻找错误的路线。 它应该寻找“demo / flows / 1 / nodes”。 它还需要一个模拟流程模型,但我不知道如何提供。 这是我生成的rspec文件中的示例代码:

  def mock_node(stubs={}) @mock_node ||= mock_model(Demo::Node, stubs).as_null_object end describe "GET index" do it "assigns all demo_nodes as @demo_nodes" do Demo::Node.stub(:all) { [mock_node] } get :index assigns(:demo_nodes).should eq([mock_node]) end end 

有人可以帮我理解我需要提供流模型吗?

你有两个不同的问题在这里,所以你可能想要拆分它们,因为你的第二个问题与这篇文章的标题无关。 我建议使用FactoryGirl创建模拟模型https://github.com/thoughtbot/factory_girl

您的路由错误来自于以下事实:您的嵌套路由在每个之后需要id,如下所示:

 /demo/flows/:flow_id/nodes/:id 

当您对对象执行删除操作时,您需要传入流ID,否则它将不知道您正在谈论的路由。

 delete :destroy, :id => "1", :flow_id => "1" 

在将来,检查它所期望的最简单方法是运行rake routes并将该rake routes的输出与你传入的params进行比较。

 demo_flow_node /demo/flows/:flow_id/nodes/:id(.:format) {:action=>"destroy", :controller=>"demo/flows"}