2009-06-16 5 views
5

W niektórych z moich kontrolerów mam filtr before_filter, który sprawdza, czy użytkownik jest zalogowany? dla działań CRUD.Testowanie funkcjonalne Authlogic?

environment.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 

Ale teraz moje testy funkcjonalne niepowodzeniem, ponieważ jego Przekierowanie do korzenia. Potrzebuję więc sposobu na symulację, że sesja została utworzona, ale nic, co próbowałem, nie zadziałało. Herezje co mam teraz i testy dość dużo go zignorować:

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 

jestem brakuje czegoś?

Odpowiedz

5

Należy przekazać obiekt ActiveRecord w UserSession.create

coś takiego:

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

Naprawdę zachęcam do odejścia od urządzeń do testowania, jeśli masz aplikację, która nie jest już od nich zależna. Są trudne do utrzymania i naprawdę frustrujące. Sprawdź railscast, Factories not Fixtures. – nitecoder

+0

Tworząc takiego użytkownika, nie testujesz, że odpowiednie kontrole są wywoływane w twoim kontrolerze (np. Musisz się zalogować, być administratorem itp.). Lepiej kpić z oczekiwanych metod, aby upewnić się, że zostaną wywołane, np. dla Mocha: mock (@controller) .expects (: current_user) .returns (@user) –

3

Wszystko, co robię w moich testach rspec dla mojego kontrolera, to utworzyć użytkownika z Machinist, a następnie przypisać tego użytkownika jako bieżącego_użytkownika.

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

i to dołącza current_user do kontrolera, co oznaczałoby, że logged_in? metoda zadziałałaby w twoich testach.

Oczywiście prawdopodobnie musiałbyś to zaadaptować do pracy w Test :: Unit i bez Machinist, jeśli go nie używasz, ponieważ używam rspec, ale jestem pewien, że zasada jest taka sama.

4

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

najpierw trzeba aktywować Authlogic tak, że można go używać w swoich badaniach.

setup :activate_authlogic 

Następnie potrzebny jest ważny zapis użytkownika, jak wskazał Anton Mironov.

+0

Ten link do dokumentów jest martwy, spróbuj tutaj: http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/ TestCase –

+1

Ta strona jest źle napisana; nie jest jasne, gdzie powinna iść linia instalacyjna. – Eric

1

umieścić to w test_helper.rb jeśli chcesz wszystkie testy do konfiguracji Authlogic:

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

Ten kawałek złamał moje testy w Ruby 1.9 i był dość trudny do wyśledzenia. Po prostu wykonuję instalację: activate_authlogic na poziomie klasy, a nie wewnątrz klasy instance_eval. – adamlamar

0

Here jest link do dokumentacji testowej Authlogic. Jest to ważne, ale jest trochę pogrzebane (ten sam link opublikował Simone, ale jego już nie działało).

Strona zawiera wszystkie informacje potrzebne do testowania aplikacji przy użyciu AuthLogic do uwierzytelniania.

Dodatkowo, zgodnie z sugestią railsninja, należy używać fabryk, a nie urządzeń. Spójrz na factory_girl i machinist; wybierz swoją truciznę, obie są dobre.