2009-06-16 4 views
5

Dans certains de mes contrôleurs, j'ai un before_filter qui vérifie si un utilisateur est connecté? pour les actions CRUD.Test fonctionnel 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 

Mais maintenant mes tests fonctionnels échouent parce que sa racine à redirigeant. J'ai donc besoin d'un moyen de simuler qu'une session a été créée mais rien de ce que j'ai essayé n'a fonctionné. Heres ce que j'ai en ce moment et les essais assez bien ignorer ce:

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 

Est-ce que je manque quelque chose?

Répondre

5

Vous devez passer l'objet ActiveRecord dans UserSession.create

Quelque chose comme:

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

Je vous encourage vraiment à vous éloigner des appareils pour tester si vous avez une application qui n'en dépend pas déjà. Ils sont difficiles à maintenir, et vraiment frustrant. Consultez le railcast, les usines pas les montages. – nitecoder

+0

En créant un utilisateur comme celui-ci, vous ne testez pas que les contrôles appropriés sont appelés dans votre contrôleur (par exemple, doit être connecté, doit être un administrateur, etc.). Il est préférable de se moquer des méthodes attendues pour s'assurer qu'elles sont appelées, par ex. pour Mocha: mock (@controller) .expects (: current_user) .returns (@user) –

3

Tout ce que je fais dans mes tests rspec pour mon contrôleur est de créer un utilisateur avec Machinist, puis d'affecter cet utilisateur à current_user.

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

et ceci attache l'current_user au contrôleur, ce qui signifierait que votre connecté? méthode fonctionnerait dans vos tests.

Vous devrez probablement adapter cela pour travailler dans Test :: Unit, et sans Machinist si vous ne l'utilisez pas, car j'utilise rspec, mais je suis sûr que le principe est le même.

4

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

D'abord, vous devez activer AuthLogic afin que vous puissiez l'utiliser dans vos tests.

setup :activate_authlogic 

Ensuite, vous avez besoin d'un enregistrement utilisateur valide comme l'a souligné Anton Mironov.

+0

Ce lien vers les docs est mort, essayez ici: http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/ TestCase –

+1

Cette page est un peu mal écrite; il n'est pas clair où la ligne d'installation est censée aller. – Eric

1

mettre cela en test_helper.rb si vous voulez que tous vos tests pour configurer Authlogic:

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

Ce bit a cassé mes tests dans ruby ​​1.9 et était assez difficile à traquer. Je ferais simplement setup: activate_authlogic au niveau de la classe plutôt qu'à l'intérieur de l'instance_eval. – adamlamar

0

Here est un lien vers la documentation de test AuthLogic. C'est important mais il est un peu enterré (le même lien que Simone a posté, mais le sien ne fonctionnait plus).

Cette page contient toutes les informations dont vous avez besoin pour tester votre application en utilisant AuthLogic pour l'authentification.

En outre, comme railsninja suggéré, utiliser des usines pas des appareils. Jetez un oeil à factory_girl et machinist; choisissez votre poison, ils sont tous les deux bons.

Questions connexes