2011-07-16 20 views
6

tengo 2 controladores que he creado usando el generador de andamio carriles. Quería que pueden anidar en una carpeta llamada "demo" y así encontré¿Cómo probar controladores con rutas anidadas usando Rspec?

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

Entonces decidí nodos nido dentro de los flujos, y ha cambiado mi archivo de rutas de este modo:

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

Pero este cambio resultó en las pruebas rspec para nodos que se rompen con ActionController :: Errores de enrutamiento.

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"} 

El problema es que rspec está buscando la ruta incorrecta. Se supone que debe buscar "demo/flows/1/nodes". También necesita un modelo simulado para el flujo, pero no estoy seguro de cómo proporcionarlo. Aquí está mi código de ejemplo del archivo generado 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 

Puede alguien ayudarme a entender cómo necesito para proporcionar el modelo de flujo?

Respuesta

15

Tiene dos preguntas diferentes pasando aquí, por lo que es posible que desee separarlos desde su segunda pregunta no tiene nada que ver con el título de este post. Yo recomiendo usar factorygirl para la creación de modelos simulados https://github.com/thoughtbot/factory_girl

Su error de ruta viene del hecho de que sus rutas anidadas requieren de identificación después de cada uno de ellos de esta manera:

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

Cuando no la elimina de la objeto, debe pasar la identificación del flujo o de lo contrario no sabrá de qué ruta está hablando.

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

En el futuro, la forma más fácil de comprobar lo que espera es ejecutar rake routes y comparar la salida para esa ruta, con lo que params está de paso en.

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