2010-08-11 6 views
37

Sto testando una funzione su uno dei miei modelli che genera errori specifici. La funzione simile a questa:Rails ActiveSupport: come affermare che viene generato un errore?

def merge(release_to_delete) 
    raise "Can't merge a release with itself!" if(self.id == release_to_delete.id) 
    raise "Can only merge releases by the same artist" if(self.artist != release_to_delete.artist ) 
    #actual merge code here 
end 

Ora voglio fare un'asserzione che quando chiamo questa funzione con un parametro che determina ciascuna di queste eccezioni, che le eccezioni in realtà vengono gettati. Stavo guardando la documentazione di ActiveSupport, ma non stavo trovando nulla di promettente. Qualche idea?

risposta

85

Quindi il test delle unità non è realmente in supporto attivo. Ruby viene fornito con un tipico framework xunit nelle libs standard (Test :: Unit in ruby ​​1.8.x, MiniTest in ruby ​​1.9), e la roba presente in activesupport aggiunge solo alcune cose ad esso.

Se si utilizza Test :: Unit/MINITEST

assert_raises(Exception) { whatever.merge } 

se si utilizza rspec (purtroppo scarsamente documentata, ma il modo più popolare)

lambda { whatever.merge }.should raise_error 

Se si vuole controllo il sollevato Exception:

exception = assert_raises(Exception) { whatever.merge } 
assert_equal("message", exception.message) 
+7

Grazie! Ho dovuto usare "RuntimeError" invece di eccezione però, in questo modo: assert_raise (RuntimeError) {artist1.merge (artist1)} Questa guida è stata estremamente utile: http://guides.rubyonrails.org/testing.html – spilliton

+1

@spilliton: Questo perché l'interprete Ruby tratta il codice sopra come "assert_raise (Exception() {whatever.merge})", cioè cerca un metodo chiamato "Exception" che viene chiamato con il blocco dato. L'aggiunta delle parentesi risolve tale ambiguità. (È già stata corretta la risposta) –

+0

In rspec 3, usare 'expect {whatever.merge} .to a raise_error' (http://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/built- in-matchers/raise-error-matcher) –

9

Per assicurarsi che nessuna eccezione è sollevata (o è gestita con successo) fare all'interno del vostro banco di prova:

assert_nothing_raised RuntimeError do 
     whatever.merge 
    end 

per controllare che errore viene generato fare all'interno del vostro banco di prova:

assert_raise RuntimeError do 
     whatever.merge 
    end 

Sì .. il suo così semplice! :)

Problemi correlati