ruby on rails - Prueba de Rspec redirect_to: volver
ruby-on-rails rspec2 (6)
Con respecto a las pruebas: vínculos de retroceso en las pruebas de integración, primero visito una página desactivada, que creo que probablemente nunca se utilizará como enlace, y luego la página que estoy probando. Entonces mi código se ve así
before(:each) do
visit deadend_path
visit testpage_path
end
it "testpage Page should have a Back button going :back" do
response.should have_selector("a",:href => deadend_path,
:content => "Back")
end
Sin embargo, esto tiene el inconveniente de que si el enlace está realmente en la vía de acceso de desapalancamiento, la prueba pasará de forma incorrecta.
¿Cómo se prueba redirect_to :back
in rspec?
yo obtengo
ActionController::RedirectBackError
:
No se establecióHTTP_REFERER
en la solicitud de esta acción, por lo queredirect_to :back
no se pudoHTTP_REFERER
éxito. Si se trata de una prueba, asegúrese de especificarrequest.env["HTTP_REFERER"]
.
¿Cómo hago para configurar HTTP_REFERER
en mi prueba?
De la guía de rieles al solicitar la solicitud con el nuevo estilo de solicitud:
describe BackController < ApplicationController do
describe "GET /goback" do
it "redirects back to the referring page" do
get :show,
params: { id: 12 },
headers: { "HTTP_REFERER" => "http://example.com/home" }
expect(response).to redirect_to("http://example.com/home")
end
end
end
En mi humilde opinión, la respuesta aceptada es un poco hacky. Una mejor alternativa sería establecer HTTP_REFERER
en una url real en su aplicación y luego esperar ser redirigido de regreso:
describe BackController, type: :controller do
before(:each) do
request.env[''HTTP_REFERER''] = root_url
end
it ''redirects back'' do
get :whatever
response.should redirect_to :back
end
end
- Redirigir a una constante de cadena aleatoria se siente como si funcionara por accidente
- Aprovecha la funcionalidad incorporada de rspec para expresar exactamente lo que quería
- No introduces y repites valores mágicos de cadenas
Para las versiones más nuevas de rspec, puede usar las expectativas en su lugar:
expect(response).to redirect_to :back
Si alguien se tropieza con esto y está utilizando especificaciones de request
, deberá establecer explícitamente los encabezados en la solicitud que está realizando. El formato de la solicitud de prueba depende de la versión de RSpec que esté utilizando y de si puede usar argumentos de palabra clave en lugar de argumentos posicionales.
let(:headers){ { "HTTP_REFERER" => "/widgets" } }
it "redirects back to widgets" do
post "/widgets", params: {}, headers: headers # keyword (better)
post "/widgets", {}, headers # positional
expect(response).to redirect_to(widgets_path)
end
https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec
Usando RSpec, puedes configurar el referer en un bloque before
. Cuando traté de establecer el referer directamente en la prueba, no pareció funcionar, no importa dónde lo puse, pero el bloque anterior funciona.
describe BackController < ApplicationController do
before(:each) do
request.env["HTTP_REFERER"] = "where_i_came_from"
end
describe "GET /goback" do
it "redirects back to the referring page" do
get ''goback''
response.should redirect_to "where_i_came_from"
end
end
end
request.env[''HTTP_REFERER''] = ''/your_referring_url''