ruby-on-rails redirect rspec rspec2

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 que redirect_to :back no se pudo HTTP_REFERER éxito. Si se trata de una prueba, asegúrese de especificar request.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''