2010-12-22 11 views
7

Estoy usando Omniauth en mi proyecto Rails, y me gustaría esconder "/ auth/facebook" detrás de una ruta "/ login".Rieles: ¿Cómo escribo una especificación para una ruta que hace una redirección?

De hecho, me escribió una ruta:

match "/login", :to => redirect("/auth/facebook"), :as => :login 

y esto realmente funciona, es decir, un enlace a login_path redirigirá a /auth/facebook.

Sin embargo, ¿cómo puedo escribir una especificación (RSpec) para probar esta ruta (específicamente, la redirección)?

Tenga en cuenta que /login no es una acción real ni un método definido en la aplicación.

¡Gracias de antemano!

+0

[Rutas Ejemplo RSpec] (https://cbabhusal.wordpress.com/2015/12/15/rails-rspec-examples-of-routing-specs/# more-1623) – illusionist

Respuesta

12

Debido a que usted no proporcionó ningún detalle sobre su entorno, el siguiente ejemplo supone que está utilizando 2.x rspec y rspec- carriles, con Rails 3.

# rspec/requests/redirects_spec.rb 
describe "Redirects" do 
    describe "GET login" do 
    before(:each) do 
     get "/login" 
    end 

    it "redirects to /auth/facebook" do 
     response.code.should == "302" 
     response.location.should == "/auth/facebook" 
    end 
    end 
end 

Lea la sección de solicitud de especificaciones de rspec-rails para más detalles.

+0

¡Esto funciona! ¡Gracias! La clave está en definir esta especificación en # spec/requests/redirects como mencionó. Anteriormente, lo hacía en ApplicationControllerSpec (lo que producía el error de que la acción "/ login" no se puede encontrar en ApplicationController), o en una de las especificaciones de especificación/enrutamiento con "* .should route_to blah" (que se quejaba de que la ruta no existe). – winstonyw

+0

Y sí, estoy usando rspec (-rails) 2.x con Rails 3. – winstonyw

+0

Otra nota que el archivo debe llamarse redirects_spec.rb, de modo que la tarea predeterminada de Rake la retome cuando acaba de hacer 'Rake' en la línea de comando. – winstonyw

0

Debe utilizar Rack::Test y comprobar el URL y el código de estado HTTP

get "/login" 
last_response.status.should == 302 
last_response.headers["Location"].should == "/auth/facebook" 
1

También puede utilizar:

get "/login" 
response.should redirect_to(path) 
Cuestiones relacionadas