shallow rails namespace examples concern ruby-on-rails routing nested testing

ruby on rails - rails - Rieles: ¿cómo modificar las pruebas de un recurso anidado?



routes rails examples (3)

Mientras aprendía Rails creé una aplicación con un controlador de Domains anidado debajo de un controlador de Customers . Estoy usando Rails 2.3.4 y ha sido una experiencia de aprendizaje. Me las arreglé para obtener la siguiente configuración de enrutamiento:

customer_domains GET /customers/:customer_id/domains(.:format) {:controller=>"domains", :action=>"index"} POST /customers/:customer_id/domains(.:format) {:controller=>"domains", :action=>"create"} new_customer_domain GET /customers/:customer_id/domains/new(.:format) {:controller=>"domains", :action=>"new"} edit_customer_domain GET /customers/:customer_id/domains/:id/edit(.:format) {:controller=>"domains", :action=>"edit"} customer_domain GET /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"show"} PUT /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"update"} DELETE /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"destroy"} customers GET /customers(.:format) {:controller=>"customers", :action=>"index"} POST /customers(.:format) {:controller=>"customers", :action=>"create"} new_customer GET /customers/new(.:format) {:controller=>"customers", :action=>"new"} edit_customer GET /customers/:id/edit(.:format) {:controller=>"customers", :action=>"edit"} customer GET /customers/:id(.:format) {:controller=>"customers", :action=>"show"} PUT /customers/:id(.:format) {:controller=>"customers", :action=>"update"} DELETE /customers/:id(.:format) {:controller=>"customers", :action=>"destroy"} root / {:controller=>"customers", :action=>"index"}

Sin embargo, todas las pruebas para el controlador de Dominios están fallando debido a errores de enrutamiento.

Por ejemplo, la siguiente prueba (generada por el generador de recursos de Rails) falla, al igual que todas las demás pruebas en la clase DomainsControllerTest .

class DomainsControllerTest < ActionController::TestCase test "should get index" do get :index assert_response :success assert_not_nil assigns(:domains) end end

Falla con el error:

No route matches {:action => "index", :controller => "domains"}

Esto tiene sentido ya que las rutas predeterminadas ya no existen y el controlador de Dominios requiere que se @customer un @customer . Pasé una tarde buscando el cambio necesario, pero casi todos los sitios hablan de pruebas de Rspec en lugar de las pruebas normales de Rails.

¿Cómo domains_controller_test.rb el domains_controller_test.rb para que comprenda el recurso anidado?


De acuerdo con sus rutas, los dominios ya no existen fuera del contexto de un cliente. La solicitud necesita un customer_id para que las rutas nombradas coincidan.

La forma de hacer esto en su prueba es:

test "should get index" do get :index, :customer_id=>joe end


Hay una gema llamada nester que resuelve este problema exacto. Genera métodos que le devuelven un domains_path y similares como si sus rutas no estuvieran anidadas. Cuando las vistas y las pruebas hacen referencia, por ejemplo, domain_path(domain) , las rutas se expanden a customer_domain_path(domain.customer, domain) . También hay un ayudante ActionController::TestCase que agrega :customer_id => @domain.customer para métodos como get , post , etc.

Las vistas y pruebas funcionales generadas por defecto funcionan de la caja con este enfoque. (Descargo de responsabilidad: lo escribí).


Pasar el id_cliente con las solicitudes sería suficiente. Algo como esto :-

class DomainsControllerTest < ActionController::TestCase test "should get index" do get :index ,:customer_id=> 1 assert_response :success assert_not_nil assigns(:domains) end end