2010-05-19 21 views
37

¿Alguien sabe cómo hacer que rspec siga una redirección (en una especificación de controlador)? (Por ejemplo, prueba/unidad tiene follow_redirect!)Rspec - Rails - Cómo seguir un redireccionamiento

He intentado "follow_redirect!" y "follow_redirect", pero sólo recibe

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! necesita ser cambiado a algo que realmente funciona.

Respuesta

19

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

Puede utilizar Webrat u otro marco de prueba de integración para probar esto.

La forma más fácil de resolver esto sin recurrir a pruebas de integración es probablemente burlarse del método que está causando la redirección.

+1

Creo que esta respuesta es incorrecta, la de zetetic es correcta – jpwynn

+4

En realidad, esta respuesta * es * correcta, y la mía no. Mi respuesta solo muestra cómo verificar que se produce una redirección: OP preguntó cómo probar el contenido de la respuesta después de seguir la redirección. – zetetic

64

Creo que este es el comportamiento predeterminado para las pruebas de controlador rspec-rails, en el sentido de que puede establecer una expectativa sobre el estado de la respuesta y/o la ruta, y probar el éxito.

Por ejemplo:

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

Hola Zetetic. Gracias por su respuesta. Lo que describa en su respuesta sería la forma correcta de Verificar que la respuesta es un 302-redirigir a la ruta de la cuenta. Lo que quiero hacer es seguir el redireccionamiento a la ruta de la cuenta y verificar el comportamiento de esa página. P.ej. Verifique que mi nueva cuenta aparezca allí. –

+0

Actualicé mi pregunta, espero que no le importe que tome prestado su ejemplo. –

+1

Supongo que he entendido mal la pregunta. ¿Ayudaría 'integrate_views' en esta situación? – zetetic

23

Se puede acceder a la ubicación de redirección con

response.headers['Location'] 

usted podría entonces solicitar que directamente.

+5

Esta es la única respuesta directa al OP. Otros indican qué ** debe ** hacerse, pero este es el único que le dice cómo hacer lo que se solicita. Eso es útil en caso de que alguien venga de una consulta de Google como yo. –

+0

Esto funcionaría, pero asegúrese de declarar 'response.params', si corresponde. Por ejemplo, tal vez quiero probar que mi redirección presenta un mensaje flash particular. probar un 'GET response.headers ['Location']' solo no hará eso. –

0

Para RSpec/+ rieles 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 seguir la lógica.

+0

esto no está definido, pero 'response.headers ['Location']' funciona –

2

Intente utilizar pruebas de integración/solicitud. Están usando acceso tipo web a través del enrutamiento a los controladores. Por ejemplo: que tengo por los carriles 2 aplicación en el archivo /spec/integration/fps_spec.rb

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 desee enviar encabezados (para la autorización http básica).

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

está bien para crear, pero después de la redirección devuelve 401 y necesita una nueva autorización. SO Tengo que dividirlo en 2 pruebas: creación y mostrar en el resultado de la creación.

1

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

En las especificaciones de solicitud follow_redirect! funciona tan bien como en Test :: Unit.

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

post_via_redirect :create, user: @user 
+0

Esto devuelve 'variable local indefinida o método 'post_via_redirect'' ¿Estoy haciendo algo mal? ¿A dónde llamarías este método? –

Cuestiones relacionadas