Pregunta

¿Alguien sabe cómo hacer rspec seguir una redirección (en una especificación de controlador)? (Por ejemplo test / unit tiene follow_redirect!)

He tratado "follow_redirect!" y "follow_redirect" pero sólo get

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>

Por ejemplo:
Al crear una cuenta en la página se redirige a la página cuentas y mi nueva cuenta debe estar en la parte superior de la lista.

it "should create an account" do
  post :create, :name => "My New Account"
  FOLLOW_REDIRECT!
  response.code.should == "200"
  accounts = assigns[:accounts]
  accounts[0].name.should == "My New Account"
end

Pero FOLLOW_REDIRECT! hay que cambiar a algo que realmente funciona.

¿Fue útil?

Solución

Si desea probar la redirección se está mudando fuera de la rspec-carriles de dominio.

Se puede utilizar Webrat o algún otro marco a prueba de integración para probar esto.

La forma más sencilla de resolver esto sin recurrir a las pruebas de integración es, probablemente, para burlarse a cabo el método que está causando la redirección.

Otros consejos

creo que este es el comportamiento por defecto para rspec-carriles pruebas del controlador , en el sentido de que se puede establecer una expectativa en el estado de respuesta y / o la ruta, y la prueba para el éxito.

Por ejemplo:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end

Puede acceder a la ubicación de redirección con

response.headers['Location']

A continuación, podría solicitar que directamente.

Trate de usar pruebas de integración / solicitud. Están utilizando acceso en banda a través de enrutamiento a los controladores. Por ejemplo: Tengo para rieles 2 aplicación en /spec/integration/fps_spec.rb archivo

 require 'spec_helper'

 describe "FinPoradci" do 

   it "POST /fps.html with params" do
     fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"}
     fp_test=FinPoradce.new(fp_params)
     #after create follow redirection to show
     post_via_redirect "/fps", {:fp => fp_params}
     response.response_code.should == 200 # => :found ,  not 302 :created
     new_fp=assigns(:fp)
     new_fp.should_not be_empty
     new_fp.errors.should be_empty
     flash[:error].should be_empty
     flash[:notice].should_not be_empty
     response.should render_template(:show)
   end
 end

y funciona. Hasta que desea enviar cabeceras (por autorización básica HTTP).

 env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
 post_via_redirect "/fps", {:fp => fp_params}, env

está muy bien para crear, pero después de redirección devuelve 401 y necesita una nueva autorización. Así que tengo que dividirlo en 2 pruebas:. Creación y espectáculo en el resultado de la creación

La especificación está fuera de alcance, si desea seguir una especificación de una solicitud de uso de redirección, el equivalente de prueba de integración en el Test :: Unidad.

En las obras follow_redirect! solicitud de especificaciones, así como en Test :: Unidad.

O si desea redirigir inmediatamente utilizar _via_redirect como sufijo para el verbo, ejemplo:

post_via_redirect :create, user: @user

Para RSpec / + Rails Capybara

response_headers['Location']

Pero funciona sólo si no hay ningún retraso antes de redirección. Si está allí, entonces es más difícil de seguir la lógica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top