Как протестировать контроллеры с вложенными маршрутами, используя Rspec? - PullRequest
8 голосов
/ 16 июля 2011

У меня есть 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 errors.

  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

Может кто-нибудь помочь мне понять, как мне нужно предоставить модель потока?

1 Ответ

16 голосов
/ 16 июля 2011

У вас есть два разных вопроса, поэтому вы можете разделить их, так как ваш второй вопрос не имеет никакого отношения к названию этого поста. Я бы рекомендовал использовать FactoryGirl для создания макетов https://github.com/thoughtbot/factory_girl

Ваша ошибка маршрута связана с тем, что для ваших вложенных маршрутов требуются идентификаторы после каждого из них, например:

/demo/flows/:flow_id/nodes/: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"}
...