rails ruby-on-rails redirect rspec routes

ruby-on-rails - rspec rails



Rails/Rspec-probando una redirección en el controlador (2)

Esta linea tiene problema

response.should redirect_to :back

La lógica no es correcta Debería esperar que #edit redireccione a :back ruta de acceso anterior configurada anteriormente, que es /scorecard . Pero estableces :back aquí. En el contexto de Rspec,: :back debe estar vacío en cada ejemplo.

Para revisar, simplemente configúralo como

response.should redirect_to ''/scorecard''

Así que actualmente estoy escribiendo una prueba para un controlador en un controlador existente que simplemente no tenía uno antes. lo que quiero probar es una redirección que ocurre cuando alguien no puede editar algo en comparación con alguien que tiene permiso para editarlo.

la acción del controlador que se está editando

def edit if [email protected]? || admin? @company = @scorecard.company @custom_css_include = "confirmation_page" else redirect_to :back end end

Entonces, si se ha revisado una tabla de puntuación, solo un administrador puede editarla. Las rutas para ese controlador ...

# scorecards resources :scorecards do member do get ''report'' end resources :inaccuracy_reports, :only => [:new, :create] end

y finalmente la prueba

require ''spec_helper'' describe ScorecardsController do describe "GET edit" do before(:each) do @agency = Factory(:agency) @va = Factory(:va_user, :agency => @agency) @admin = Factory(:admin) @company = Factory(:company) @scorecard = Factory(:scorecard, :level => 1, :company => @company, :agency => @agency, :reviewed => true) request.env["HTTP_REFERER"] = "/scorecard" end context "as a admin" do before(:each) do controller.stub(:current_user).and_return @admin end it "allows you to edit a reviewed scorecard" do get ''edit'', :id => @scorecard.id response.status.should be(200) end end context "as a va_user" do before(:each) do controller.stub(:current_user).and_return @va end it "does not allow you to edit a reviewed scorecard" do get ''edit'', :id => @scorecard.id response.should redirect_to :back end end end end

por lo que se redireccionará una va al intentar editar una puntuación revisada, donde un administrador no lo hará.

pero al ejecutar esto a través de rspec consigo

ScorecardsController GET edit as a admin allows you to edit a reviewed scorecard as a va_user does not allow you to edit a reviewed scorecard (FAILED - 1) Failures: 1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard Failure/Error: response.should redirect_to :back Expected response to be a redirect to </scorecard> but was a redirect to <http://test.host/> # ./spec/controllers/scorecards_controller_spec.rb:33:in `block (4 levels) in <top (required)>'' Finished in 0.48517 seconds 2 examples, 1 failure

así que no sé si está funcionando o no, ya que configuré request.env["HTTP_REFERER"] = "/scorecard" como el lugar que debería ser :back como estaba. ¿O me estoy perdiendo la idea de que, al mirar httpstatus hay 300 respuestas que podría usar, pero no sabría por dónde empezar?

Cualquier ayuda sería increíble

EDITAR

podría probarlo haciéndolo así

... response.status.should be(302)

pero obtuve la idea de esta question y parece que esto podría ser poderoso ya que especifica la URL a la que se redirige.

cualquiera tiene una prueba de trabajo como esta


Para hacer que la prueba sea más legible, puede hacer esto: (rspec ~> 3.0)

expect(response).to redirect_to(action_path)