Ich möchte eine Funktion auf einem meiner Modelle testen, die bestimmte Fehler verursacht. Die Funktion sieht wie folgt aus:Rails ActiveSupport: Wie man behauptet, dass ein Fehler ausgelöst wird?
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
Jetzt möchte ich eine Assertion tun, dass, wenn ich rufe diese Funktion mit einem Parameter, der jede dieser Ausnahmen veranlasst, dass die Ausnahmen tatsächlich geworfen bekommen. Ich habe mir die ActiveSupport-Dokumentation angesehen, aber ich habe nichts Positives gefunden. Irgendwelche Ideen?
Danke! Ich musste "RuntimeError" anstelle von Ausnahme verwenden, so: assert_raise (RuntimeError) {artist1.merge (artist1)} Dieser Leitfaden war sehr hilfreich: http://guides.rubyonrails.org/testing.html – spilliton
@spilliton: Das liegt daran, dass der Ruby-Interpreter den obigen Code als 'assert_raise (Exception() {whatever.merge})' behandelt, dh nach einer Methode mit dem Namen 'Exception' sucht, die mit dem gegebenen Block aufgerufen wird. Das Hinzufügen der Klammern löst diese Mehrdeutigkeit auf. (Die Antwort wurde bereits festgelegt.) –
In rspec 3 verwenden Sie 'expect {what.merge} .to raise_error' (http://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/built- In-Matcher/Raise-Fehler-Matcher) –