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
Creo que quieres el redirect_to matcher .
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