2010-08-11 9 views
37

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?

Antwort

85

So Unit-Tests sind nicht wirklich in activesupport. Ruby kommt mit einem typischen xunit-Framework in den Standard-Bibliotheken (Test :: Unit in Ruby 1.8.x, MiniTest in Ruby 1.9), und das Zeug in activesupport fügt einfach etwas hinzu.

Wenn Sie Testen verwenden :: Unit/Minitest

assert_raises(Exception) { whatever.merge } 

wenn Sie rspec verwenden (leider schlecht dokumentiert, aber viel populäreren)

lambda { whatever.merge }.should raise_error 

Wenn Sie überprüfen möchten die erhöhte Exception:

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

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

+1

@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.) –

+0

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) –

9

Um sicherzustellen, dass keine Ausnahme ausgelöst wird (oder erfolgreich gehandhabt wird) zu tun in Ihrem Testfall:

assert_nothing_raised RuntimeError do 
     whatever.merge 
    end 

diese Fehler Um zu überprüfen, wird in Ihrem Testfall angehoben tun:

assert_raise RuntimeError do 
     whatever.merge 
    end 

Yeah .. seine so einfach ist das! :)

Verwandte Themen