Rspec - Rieles - ¿Cómo seguir una redirección
-
30-09-2019 - |
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.
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.