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

8

我有2个控制器是使用Rails的脚手架生成的。我希望它们被嵌套在一个名为“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”。同时,它需要一个模拟flow模型,但我不确定如何提供。以下是我的样例代码,来自生成的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

有人能帮我理解如何提供流程模型吗?

1个回答

16
你在这里提出了两个不同的问题,因此你可能需要将它们分开,因为你的第二个问题与这篇文章的标题毫无关系。我建议使用FactoryGirl来创建模拟模型https://github.com/thoughtbot/factory_girl
你的路由错误是由于你的嵌套路由要求在每个路由后面加上id,就像这样:
/demo/flows/:flow_id/nodes/:id
当你在对象上执行删除操作时,需要传递流程 ID,否则它将不知道你所说的路线。
delete :destroy, :id => "1", :flow_id => "1"

在将来,检查程序所期望的最简单方法是运行rake routes命令,并将该路由的输出与您传递的参数进行比较。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接