2009-06-16 29 views
5

In alcuni dei miei controller ho un before_filter che controlla se un utente ha effettuato l'accesso? per azioni CRUD.Test funzionali 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 

Ma ora il mio test non hanno dato esito perché la sua reindirizzamento alla radice. Quindi ho bisogno di un modo per simulare che sia stata creata una sessione, ma non ho funzionato. Heres quello che ho in questo momento e le prove più o meno finta di niente:

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 

Mi sto perdendo qualcosa?

risposta

5

Si dovrebbe passare oggetto ActiveRecord in UserSession.create

Qualcosa di simile:

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

Ti consiglio davvero di allontanarti dai proiettori per testare se hai un'app che non dipende già da loro. Sono difficili da mantenere e semplicemente frustranti. Dai un'occhiata al railscast, Factories not Fixtures. – nitecoder

+0

Creando un utente come quello che non stai testando che i controlli appropriati sono chiamati nel tuo controller (ad esempio, devi essere registrato, deve essere un amministratore, ecc.). È meglio prendere in giro i metodi previsti per assicurarsi che vengano chiamati, ad es. per Mocha: mock (@controller) .expects (: current_user) .returns (@user) –

3

Tutto ciò che faccio nei miei test rspec per il mio controller è creare un utente con Machinist e quindi assegnare a tale utente l'utente corrente.

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

e questo collega l'utente corrente al controller, il che significherebbe che il tuo login_in? il metodo dovrebbe funzionare nei tuoi test.

Ovviamente, probabilmente dovresti adattare ciò per funzionare in Test :: Unit, e senza Machinist se non lo usi, visto che uso rspec, ma sono sicuro che il principio è lo stesso.

4

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

In primo luogo è necessario attivare l'Authlogic in modo che si può utilizzare nei test.

setup :activate_authlogic 

Quindi è necessario un record utente valido come sottolineato da Anton Mironov.

+0

Il link ai documenti è morto, prova qui: http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/ TestCase –

+1

Questa pagina è scritta male; non è chiaro dove dovrebbe andare la linea di installazione. – Eric

1

mettere questo in test_helper.rb se si desidera che tutti i test per configurare Authlogic:

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

Questo bit ha rotto i miei test in Ruby 1.9 ed è stato piuttosto difficile da rintracciare. Mi limiterei a impostare: activate_authlogic a livello di classe piuttosto che all'interno di instance_eval. – adamlamar

0

Here è un link alla documentazione di prova Authlogic. È importante ma è un po 'sepolto (lo stesso link pubblicato da Simone, ma non ha funzionato più).

Questa pagina contiene tutte le informazioni necessarie per testare l'applicazione utilizzando AuthLogic per l'autenticazione.

Inoltre, come suggerito da railsninja, non utilizzare fabbriche. Dai un'occhiata a factory_girl e machinist; scegli il tuo veleno, sono entrambi buoni.