2009-05-07 6 views
5

Ho un numero di controller nelle mie app Ruby on Rails con un gestore di ripristino alla fine dell'azione che rileva in pratica qualsiasi errore non gestito e restituisce una sorta di errore "user friendly". Tuttavia, quando eseguo il rake test mi piacerebbe avere disattivati ​​i gestori di salvataggio predefiniti in modo da poter vedere l'errore completo & traccia dello stack. C'è un modo automatico per fare questo?Come disattivare i soccorritori nelle app Ruby on Rails quando eseguo test funzionali?

Aggiornamento per chiarire: ho un'azione come questa:

def foo 
    # do some stuff... 
rescue 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 

Ora, quando ho test funzionale questo, se l'eccezione è sollevata poi ho intenzione di ottenere solo un po 'di informazioni su l'eccezione, ma quello che mi piacerebbe è che agisca come se non ci fosse alcun gestore di salvataggio, quindi ricevo le informazioni complete di debug.

Aggiornamento: SOLUZIONE

ho fatto questo:

rescue: 
    raise unless Rails.env.production? 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
    end 

risposta

9

Non completamente automatizzato, ma come modificare il codice per ripetere le eccezioni ogni volta che viene chiamato all'interno di un test?

Forse qualcosa di simile:

def foo 
    # do some stuff... 
rescue 
    raise if ENV["RAILS_ENV"] == "test" 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 
+0

bello ci proverò! –

+3

rilancia se Rails.env.test? è più pulito IMO – Scott

+0

@Steven questo in realtà non salva solo in produzione. Solleva dov'è .. ma se hai 20 linee di codice nella roba #do allora il rilancio non dà alcun riferimento a questo. La traccia indica l'errore si è verificato sulla riga che il rialzo è attivo. – baash05

0

hai guardato utilizzando la chiamata assert_raise(exception1, exception2, ...) { block } e quindi la stampa l'eccezione dal blocco?

0

Quale metodo stai utilizzando? Ci sono due metodi di salvataggio in ActionController.

ho questo nel mio controller di base:

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
     format.html { render_optional_error_file response_code} 
     format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
end 

fine

Questo solo errori display personalizzati in modalità di produzione.

+0

Perché girare solo in modalità di produzione? Non lo vedo. –

-1

Non è necessario disabilitare il blocco di soccorso. Utilizzare il metodo assert_raise (come suggerito da Scott) e nel blocco, chiamare il metodo da cui si prevede un'eccezione.

Ad esempio:

def test_throws_exception 
    assert_raise Exception do 
    raise_if_true(true) 
    end 
end 
+0

Non sto cercando di far valere un'eccezione, so tutto su come farlo e l'ho fatto molte volte. Sto cercando di ottenere informazioni complete sulle eccezioni che si verificano quando non me le aspetto (inclusa la traccia dello stack) ma solo quando sono in modalità test. –

+0

Ah. Scusate. Ho frainteso ciò che stavi cercando di ottenere. –

0

Penso che la cosa più semplice da fare è verificare che la corretta rendono era called-- o qualsiasi altra cosa era diverso dal normale, caso non eccezionale.