Wie verwende ich RSpecs should_raise mit jeder Ausnahme?

211

Ich möchte so etwas machen:

some_method.should_raise <any kind of exception, I don't care>

Wie soll ich das machen?

some_method.should_raise exception

... funktioniert nicht.

marcgg
quelle

Antworten:

380
expect { some_method }.to raise_error

RSpec 1 Syntax:

lambda { some_method }.should raise_error

Weitere Informationen finden Sie in der Dokumentation (zur RSpec 1-Syntax) und in der RSpec 2-Dokumentation .

Avdi
quelle
5
ahh .. Ich habe gerade die geschweiften Klammern bemerkt!
Louis Sayers
88

RSpec 2

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

Hinweis: raise_errorund raise_exceptionsind austauschbar.

RSpec 1

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

Hinweis: raise_errorist ein Alias ​​für raise_exception.

Dokumentation: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:

joelparkerhenderson
quelle
Das war eine großartige Antwort.
Ziggy
erhöhe_error (/ oops /) ist eine gute Möglichkeit, Teilzeichenfolge in Ausnahmemeldung zu überprüfen
Serge Seletskyy
1
Vielen Dank für den Hinweis, dass Raise_Fehler und für Raise_Ausnahme austauschbar sind (y)
Yo Ludke
85

Verwenden Sie anstelle von Lambda Folgendes:

   expect { some_method }.to raise_error

Dies gilt für neuere Versionen von rspec, dh rspec 2.0 und höher.

Weitere Informationen finden Sie im Dokument .

racc
quelle
Ich würde dies nicht für Rspec 1 verwenden, aber für Rspec 2 funktioniert es genau so, wie es sollte.
Ericraio
6
Tatsächlich sollte gemäß dem obigen Dokumentationslink erwartet
Guilherme Garnier
Weder Ihr Kommentar noch die Seite, auf die Sie verlinken, erklären, warum expectbesser oder schlechter ist als lambda.
Kragen Javier Sitaker
1
Erwarten Sie für rspec 2.0 und höher. Dies macht das Argument, welches besser ist, umstritten, da die Lambda-Syntax nicht mehr funktioniert
Rob
Dies funktioniert nicht für mich in Capybara:expect { visit welcome_path }.to raise_error
Nnyby
65

Die Syntax hat sich kürzlich geändert und jetzt ist es:

expect { ... }.to raise_error(ErrorClass)
Ayckoster
quelle
4

Ab Version 3.3 rspec-expectionslöst gem eine Warnung für einen leeren Raise_error ohne Parameter aus

expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine

Dies gibt Ihnen einen Hinweis darauf, dass Ihr Code möglicherweise mit einem anderen Fehler als dem zu überprüfenden Test fehlschlägt.

WARNUNG: Mit dem raise_errorMatcher ohne einen bestimmten Fehler oder eine Nachricht Bereitstellung Risiken falsch positive Ergebnisse , da raise_errorpassen, wenn Rubin ein wirft NoMethodError, NameErroroder ArgumentErrormöglicherweise die Erwartung ermöglicht , ohne auch nur zu passieren Durchführung des Verfahrens Sie zu nennen beabsichtigen. Geben Sie stattdessen eine bestimmte Fehlerklasse oder Nachricht an. Diese Meldung kann durch folgende Einstellungen unterdrückt werden : RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Bruno E.
quelle