rails rack_test matchers feature example ruby-on-rails testing rspec web-testing

ruby-on-rails - rack_test - shoulda matchers



Rspec-Rails-Cómo seguir una redirección (6)

¿Alguien sabe cómo hacer que rspec siga una redirección (en una especificación de controlador)? (por ejemplo, la prueba / unidad tiene follow_redirect!)

Lo he intentado con "follow_redirect!" y "follow_redirect" pero solo obtienes

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

Por ejemplo:
Cuando creo una cuenta, la página se redirige a la página de 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.


Creo que este es el comportamiento predeterminado para las rspec-rails 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


Intenta usar pruebas de integración / solicitud. Están usando acceso tipo web a través del enrutamiento a los controladores. Por ejemplo: tengo la aplicación Rails 2 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. Así que tengo que dividirlo en 2 pruebas: creación y mostrar en el resultado de la creación.


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 la solicitud follow_redirect! funciona tan bien como en Test :: Unit.

O si desea redirigir de inmediato use _via_redirect como sufijo para el verbo, ejemplo:

post_via_redirect :create, user: @user


Para RSpec / Capybara + Rails

response_headers[''Location'']

Pero funciona solo si no hay demora antes de redirigir. Si está allí, entonces es más difícil seguir la lógica.


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

response.headers[''Location'']

entonces podrías solicitarlo directamente.


Si desea probar la redirección, se está moviendo fuera del dominio rspec-rails.

Puede usar 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.