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.