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