2009-06-16 11 views
5

En algunos de mis controladores, ¿tengo un before_filter que verifica si un usuario está conectado? para las acciones de CRUD.Pruebas funcionales Authlogic?

application.rb

def logged_in? 
    unless current_user 
    redirect_to root_path 
    end 
end 

private 
def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
end 

def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.record 
end 

Pero ahora mis pruebas funcionales fallan debido a que su redireccionamiento a la raíz. Entonces necesito una manera de simular que se ha creado una sesión, pero nada de lo que he probado ha funcionado. Esto es lo que tengo en este momento y las pruebas más o menos lo ignoran:

test_helper.rb

class ActionController::TestCase 
    setup :activate_authlogic 
end 

posts_controller_test.rb

class PostsControllerTest < ActionController::TestCase 
    setup do 
    UserSession.create(:username => "dmix", :password => "12345") 
    end 

    test "should get new" do 
    get :new 
    assert_response :success 
    end 

Me estoy perdiendo algo?

Respuesta

5

Debe pasar objeto ActiveRecord en UserSession.create

Algo así como:

u = users(:dmix) 
UserSession.create(u) 
+3

Realmente te animo a que te alejes de los accesorios para probar si tienes una aplicación que aún no depende de ellos. Son difíciles de mantener, y realmente frustrantes. Echa un vistazo a los rieles, fábricas no accesorios. – nitecoder

+0

Al crear un usuario como ese, no está probando que se llaman las comprobaciones apropiadas en su controlador (por ejemplo, debe haber iniciado sesión, debe ser un administrador, etc.). Es mejor burlarse de los métodos esperados para asegurarse de que los llamen, p. para Mocha: mock (@controller) .expects (: current_user) .returns (@user) –

3

Todo lo que hago en mis pruebas de rspec para mi controlador es crear un usuario con Maquinista y luego asignar ese usuario para que sea el usuario_actual.

def login_user(options = {}) 
    user = User.make(options) 
    @controller.stub!(:current_user).and_return(user) 
end 

y esto conecta el usuario_actual al controlador, lo que significa que su sesión_in? método funcionaría en sus pruebas.

Es probable que necesite adaptar esto para trabajar en Test :: Unit, y sin Machinist si no lo usa, ya que uso rspec, pero estoy seguro de que el principio es el mismo.

4

http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/TestCase

Lo primero que necesita para activar AuthLogic para que pueda utilizarlo en sus pruebas.

setup :activate_authlogic 

Luego necesita un registro de usuario válido como señaló Anton Mironov.

+0

Ese enlace a los documentos está muerto, intente aquí: http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/ TestCase –

+1

Esa página está mal escrita; no está claro dónde se supone que debe ir la línea de configuración. – Eric

1

poner esto en test_helper.rb si desea que todas sus pruebas para configurar Authlogic:

class ActionController::TestCase 
    def self.inherited(subclass) 
    subclass.instance_eval do 
     setup :activate_authlogic 
    end 
    end 
end 
+0

Este bit rompió mis pruebas en ruby ​​1.9 y fue bastante difícil de rastrear. Me gustaría hacer la configuración: activate_authlogic en el nivel de clase en lugar de dentro de instance_eval. – adamlamar

0

Here es un enlace a la documentación de las pruebas AuthLogic. Es importante pero está un poco enterrado (el mismo enlace que publicó Simone, sin embargo, el suyo ya no funcionaba).

Esa página tiene toda la información que necesita para comenzar a probar su aplicación con AuthLogic para la autenticación.

Además, como sugería railsninja, use fábricas y no accesorios. Eche un vistazo a factory_girl y machinist; recoge tu veneno, ambos son buenos.

Cuestiones relacionadas