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
War es hilfreich?

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.

Quelle: http://www.ruby-forum.com/topic/44495

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top