簡體   English   中英

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

[英]How to test controllers with nested routes using Rspec?

我有 2 個控制器,它們是使用腳手架生成器創建的。 我希望它們嵌套在一個名為“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”。 它還需要一個模擬 model 用於流程,但我不知道如何提供。 這是我生成的 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

有人可以幫助我了解我需要如何提供流程 model 嗎?

您在這里有兩個不同的問題,因此您可能希望將它們分開,因為您的第二個問題與這篇文章的標題無關。 我建議使用 FactoryGirl 創建模擬模型https://github.com/thoughtbot/factory_girl

您的路由錯誤來自這樣一個事實,即您的嵌套路由在每個路由之后都需要 id,如下所示:

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

當你在 object 上進行刪除時,你需要傳入流 ID,否則它不會知道你在說什么路由。

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

將來,檢查它所期望的最簡單的方法是運行rake routes並將該路由的 output 與您傳入的參數進行比較。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM