2011-07-16 4 views
6

У меня есть два контроллера, которые я создал с помощью эскадронов-генераторов рельсов. Я хотел, чтобы они были вложены в папке под названием «демо» и так побежалКак проверить контроллеры с вложенными маршрутами с помощью Rspec?

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

Тогда я решил гнездовые узлы внутри потоков, и изменил мои маршруты файл следующим образом:

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

Но это изменение приведенные в тестах rspec для разрывов узлов с помощью ActionController :: Ошибки маршрутизации.

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/flow/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 

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

ответ

15

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

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

/demo/flows/:flow_id/nodes/: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"} 
Смежные вопросы