2009-06-16 17 views
5

In einigen meiner Controller habe ich einen before_filter, der prüft, ob ein Benutzer angemeldet ist? für CRUD-Aktionen.Funktionsprüfung 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 

Aber jetzt meine funktionellen Tests fehlschlagen, weil sein Umleiten zu root. Also brauche ich eine Möglichkeit zu simulieren, dass eine Sitzung erstellt wurde, aber nichts, was ich versucht habe, hat funktioniert. Heres, was ich jetzt habe und die Tests ziemlich ignorieren:

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 

Bin ich etwas fehlt?

Antwort

5

sollten Sie Active Pass Objekt in UserSession.create

Etwas wie:

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

Ich ermutige Sie wirklich, von den Vorrichtungen zum Testen wegzugehen, wenn Sie eine App haben, die nicht bereits von ihnen abhängt. Sie sind schwer zu pflegen und frustrierend. Schauen Sie sich die Railscast, Fabriken nicht Fixtures. – nitecoder

+0

Indem Sie einen solchen Benutzer erstellen, testen Sie nicht, ob die entsprechenden Prüfungen in Ihrem Controller aufgerufen werden (z. B. muss er eingeloggt sein, muss ein Administrator sein usw.). Es ist besser, die erwarteten Methoden zu verspotten, um sicherzustellen, dass sie aufgerufen werden, z. für Mocha: mock (@controller) .expects (: current_user) .returns (@user) –

3

Alles, was ich in meinen RSPC-Tests für meinen Controller mache, ist, einen Benutzer mit Maschinist zu erstellen und diesen Benutzer dann dem aktuellen Benutzer zuzuweisen.

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

und dies legt die current_user an die Steuerung, die das Ihre logged_in bedeuten würde? Methode würde in Ihren Tests funktionieren.

Sie müssten dies wahrscheinlich anpassen, um in Test :: Unit zu arbeiten, und ohne Machinist, wenn Sie es nicht verwenden, wie ich rspec verwende, aber ich bin mir sicher, das Prinzip ist das gleiche.

4

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

Zuerst müssen Sie AuthLogic aktivieren, damit Sie es in Ihren Tests verwenden können.

Dann brauchen Sie einen gültigen Benutzerdatensatz, wie Anton Mironov darauf hingewiesen hat.

+0

Dieser Link zu den Dokumenten ist tot, versuchen Sie es hier: http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/ TestCase –

+1

Diese Seite ist irgendwie schlecht geschrieben; Es ist nicht klar, wohin die Setup-Linie gehen soll. – Eric

1

Diesen in test_helper.rb wenn Sie alle Ihre Tests einrichten Authlogic wollen:

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

Dieses Bit brach meine Tests in Ruby 1.9 und war ziemlich schwer zu finden. Ich würde nur Setup: activate_authlogic auf der Klassenebene statt innerhalb der Instanz_eval. – adamlamar

0

Here ist ein Link auf die AuthLogic Testdokumentation. Es ist ein wichtiger, aber ein wenig vergraben (der gleiche Link, den Simone gepostet hat, aber er hat nicht mehr funktioniert).

Diese Seite enthält alle Informationen, die Sie zum Testen Ihrer Anwendung mit AuthLogic zur Authentifizierung benötigen.

Zusätzlich, wie railsninja vorgeschlagen, verwenden Sie Fabriken nicht Armaturen. Werfen Sie einen Blick auf factory_girl und machinist; nimm dein Gift, sie sind beide gut.