rails ruby-on-rails rspec

ruby-on-rails - rspec rails



¿Las especificaciones de enrutamiento admiten rutas de redireccionamiento? (5)

Después de profundizar bastante en este tema, he llegado a un punto muerto entre mi comprensión de la documentación y mis resultados.

De acuerdo con https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/routing-specs/route-to-matcher , deberíamos poder escribir lo siguiente:

#rspec-rails (2.8.1) #rspec (>= 1.3.1) #rspec-core (~> 2.8.0) # routing spec require "spec_helper" describe BusinessUsersController do describe "routing" do it "routes to some external url" do get("/business_users/7/external_url").should route_to("http://www.google.com") end end end # routes.rb BizeebeeBilling::Application.routes.draw do resources :business_users do member do get "external_url" => redirect("http://www.google.com") end end end

La ejecución de esta especificación produce los siguientes resultados: Fallos:

1) BusinessUsersController routing routes to some external url Failure/Error: assert_routing "/business_users/7/external_url", "http://www.google.com" ActionController::RoutingError: No route matches "/business_users/7/external_url" # ./spec/routing/business_users_routing_spec.rb:19:in `block (3 levels) in <top (required)>''

No he podido encontrar a nadie que informe de este problema específico en cualquier lugar.

Detalle adicional: la ruta se resuelve perfectamente cuando se prueba manualmente.


Andy Lindeman tiene la respuesta correcta. Sin embargo, no tiene que poner la especificación en espec. / Solicitudes, puede mantenerla en espec. / Enrutamiento y ser explícito con los metadatos "tipo": describe ''my route'', type: :request do



La forma más sencilla de probar redirecciones externas es utilizar una prueba de integración:

test "GET /my_page redirects Google" do get "/my_page" assert_redirected_to "https://google.com" end

La prueba debe estar bajo su directorio de test/integration o el directorio equivalente donde deben ir las pruebas de integración.


Las especificaciones / pruebas de enrutamiento se especializan en probar si una ruta se asigna a un controlador y acción específicos (y tal vez algunos parámetros también).

Me metí un poco en el interior de Rails y Journey. RSpec y Rails (básicamente, algunos detalles Rails.application.routes.recognize_path ) utilizan Rails.application.routes.recognize_path para responder a la pregunta "¿es esto enrutable?"

Por ejemplo:

$ rails console > Rails.application.routes.recognize_path("/business_users/1", method: "GET") => {:action=>"show", :controller=>"business_users", :id=>"1"}

Sin embargo, no hay un controlador en el otro extremo de /business_users/1/external_url . De hecho, para realizar la redirección, Rails ha creado una instancia de ActionDispatch::Routing::Redirect , que es una aplicación pequeña de Rack. No se toca ningún controlador de rieles. Básicamente, está montando otra aplicación de Rack para realizar la redirección.

Para probar la redirección, recomiendo usar una especificación de solicitud en su lugar (un archivo en spec/requests ). Algo como:

require "spec_helper" describe "external redirection" do it "redirects to google.com" do get "/business_users/1/external_url" response.should redirect_to("http://www.google.com") end end

Esto prueba la ruta implícitamente, y le permite probar contra la redirección.


Me encontraba en un caso similar en el que intentaba probar una serie de rutas, algunas que debían redirigirse y otras que no. Quería mantenerlos en una sola especificación de enrutamiento, ya que era la forma más lógica de agruparlos.

Intenté usar describe: ''my route'', type: request , pero encontré que no funciona. Sin embargo, puede incluir RSpec::Rails::RequestExampleGroup en su contexto de especificaciones para obtener acceso a los métodos de especificaciones de solicitudes. Algo como:

describe "My Routes" do context "Don''t Redirect" do it "gets URL that doesn''t redirect" do get("business_users/internal_url").should route_to(controller: "business_users", action: "internal_url_action") end end context "Redirection" do include RSpec::Rails::RequestExampleGroup it "redirects to google.com" do get "/business_users/1/external_url" response.should redirect_to("http://www.google.com") end end end