Mi piacerebbe fare qualcosa del genere:
some_method.should_raise <any kind of exception, I don't care>
Come dovrei farlo?
some_method.should_raise exception
... non funziona.
Risposte:
expect { some_method }.to raise_error
Sintassi RSpec 1:
lambda { some_method }.should raise_error
Vedere la documentazione (per la sintassi RSpec 1) e la documentazione RSpec 2 per ulteriori informazioni.
expect { some_method }.to raise_error
expect { some_method }.to raise_error(SomeError)
expect { some_method }.to raise_error("oops")
expect { some_method }.to raise_error(/oops/)
expect { some_method }.to raise_error(SomeError, "oops")
expect { some_method }.to raise_error(SomeError, /oops/)
expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" }
# Rspec also offers to_not:
expect { some_method }.to_not raise_error
...
Nota: raise_error
e raise_exception
sono intercambiabili.
lambda { some_method }.should raise_error
lambda { some_method }.should raise_error(SomeError)
lambda { some_method }.should raise_error(SomeError, "oops")
lambda { some_method }.should raise_error(SomeError, /oops/)
lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" }
# Rspec also offers should_not:
lambda { some_method }.should_not raise_error
...
Nota: raise_error
è un alias per raise_exception
.
RSpec 2:
RSpec 1:
Invece di lambda, usa aspettati di:
expect { some_method }.to raise_error
Questo vale per le versioni più recenti di rspec, cioè rspec 2.0 e superiori.
Vedere il documento per ulteriori informazioni.
expect
è meglio o peggio di lambda
.
expect { visit welcome_path }.to raise_error
Dalla versione 3.3 in poi rspec-expections
gem solleva un avviso per un raise_error vuoto senza un parametro
expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine
Questo ti dà un suggerimento che il tuo codice potrebbe non riuscire con un errore diverso da quello che il test intendeva controllare.
ATTENZIONE: Usare il
raise_error
matcher senza fornire un errore o un messaggio specifico rischia di falsi positivi, poichéraise_error
corrisponderà quando Ruby solleva unNoMethodError
,NameError
oArgumentError
, potenzialmente permettendo che l'aspettativa passi senza nemmeno eseguire il metodo che si intende chiamare. Considerare invece di fornire una classe o un messaggio di errore specifico. Questo messaggio può essere soppressa per impostazione:RSpec::Expectations.configuration.warn_about_potential_false_positives = false
.