2011-07-16 91 views
6

我有2个控制器,我使用轨道的脚手架发电机创建。我希望他们可以嵌套一个名为“演示”文件夹中,因此跑如何使用Rspec测试具有嵌套路由的控制器?

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正在看错误的路线。它应该寻找“演示/流量/ 1 /节点”。它也需要模拟流程模型,但我不知道如何提供。这里是我生成的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 

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

回答

15

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

您的路线错误是从你的嵌套的路线需要这样他们每个人之后的id的事实来:

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

当你做对的删除对象,你需要传入流程ID,否则它不会知道你在说什么路线。

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

今后,要检查什么,预计最简单的方法是运行rake routes,并为这条路线的输出与你PARAMS你所传递的比较。

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