Mientras aprendía Rails, he creado una aplicación con un controlador Domains
anidado debajo de un controlador 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:Rieles: ¿cómo modificar las pruebas de un recurso anidado?
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 por defecto ya no existen y el controlador de Dominios requiere un @customer
a establecer. 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 modifico el domains_controller_test.rb
para que entienda el recurso anidado?
Eso parece funcionar, Rishav. ¿Hay alguna forma de SECAR esto, en lugar de pasar el ID a cada prueba por separado? –
Martijn, eso es lo que vas a tener que hacer. Su ruta debe saber que el cliente debe trabajar. Supongo que podría escribir un asistente de prueba para reemplazar la llamada "obtener" que autocompleta la parte customer_id del hash, pero parece una mala idea, a menos que esté escribiendo muchas, muchas pruebas en contra de DomainsController. –
Solo quiero señalar por qué DRYing esto podría ser una mala idea, porque podría ser difícil de leer y depurar. El código DRY es genial, pero no cuando sacrifica la legibilidad. En una prueba, definitivamente quiere poder ver lo que está pasando. Si puedes DIVIDIRLO sin sacrificar la legibilidad o agregar fragilidad a la prueba, hazlo. – WattsInABox