Mokka-Stubs mit Ausnahme – RSpec-Test nicht bestanden
-
09-09-2020 - |
Frage
Hey, ich versuche, Mokka und RSPEC zu verwenden, um ein Szenario zu testen, in dem eine Methode immer eine Ausnahme hervorruft.
Hier ist der Controller-Code, den ich testen möchte:
def add_parent
begin
parent = Entity.find_by_id(params[:parent_id])
if !parent.nil?
@entity.add_parent!(parent)
flash[:success] = "Entity successfully updated."
else
raise "Parent does not exist."
end
rescue
flash[:error] = "Something bad happened. #{$!}"
end
redirect_to @entity
end
Hier ist der Testcode:
it "should flash error if exception is thrown when adding parent" do
Entity.any_instance.stubs(:add_parent!).raises(Exception)
lambda do
post :add_parent, :id => @entity[:id],
:parent_id => @parent_entity[:id]
end.should_not change(@entity.parents, :count)
flash[:error].should =~ /something bad happened/i
end
Hier ist die Methode, die blockiert wird:
def add_parent!(parent)
Entity.transaction do
lock!('lock in share mode')
self.parents << parent
end
end
Ich erhalte den folgenden rspec-Fehler, der ziemlich wenig aussagekräftig ist und daher nicht weiß, wie ich ihn beheben kann.
Failures:
1) EntitiesController POST 'add_parent' for signed-in users allow access with edit permission should flash error if exception is thrown when adding parent
Failure/Error: post :add_parent, :id => @entity[:id],
Exception
# ./app/controllers/entities_controller.rb:81:in `add_parent'
# ./spec/controllers/entities_controller_spec.rb:1010
Lösung
Wooah, zunächst einmal ist es eine sehr schlechte Angewohnheit, einen großen Teil des Codes zu retten, ohne die Ausnahmeklasse anzugeben, die Sie hier erwarten.Alles zu retten ist nicht gut.Am besten die ganze Rettung entfernen, evtl. verwenden find
über find_by_id
Damit Rails diesen 404-Fehler erkennen können, stört Sie das nicht.Sollte dieser Fehler andererseits häufig vorkommen?Es sieht so aus, als wären da irgendwelche DB-Sachen im Gange, also würde ich nicht damit rechnen, dass es fehlschlägt.
Zweitens denke ich, dass Sie testen müssen, wie es im Handbuch steht raise_error
http://relishapp.com/rspec/rspec-expectations/v/2-6/dir/built-in-matchers/raise-error-matcher
Andere Tipps
rescue
ohne Argument rettet standardError und seine Nachkommen.Wenn Sie alle Ausnahmen fangen möchten, sollten Sie generakodicetagcode als alle Ausnahmen von der Klassenausnahme absteigen.