окурки мокко за исключением - тест rspec не пройден - PullRequest
0 голосов
/ 23 мая 2011

Эй, Я пытаюсь использовать Mocha и Rspec для тестирования сценария, в котором метод всегда вызывает какое-то исключение.

Вот код контроллера, который я пытаюсь проверить:

  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

Вот код теста:

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

Вот метод, который в настоящее время заглушен:

  def add_parent!(parent)
    Entity.transaction do
      lock!('lock in share mode')
      self.parents << parent
    end
  end

Я получаю следующую ошибку rspec, которая довольно неинформативна, поэтому я не знаю, как ее решить ..

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

Ответы [ 2 ]

0 голосов
/ 31 мая 2012

rescue без аргументов спасет StandardError и его потомков. Если вы хотите перехватить ВСЕ исключения, вы должны rescue Exception, поскольку все исключения происходят от класса Exception.

Источник: http://www.ruby -forum.com / topic / 44495

0 голосов
/ 24 мая 2011

Во-первых, это очень плохая привычка - спасать от большого куска кода, не давая класса исключения, который вы ожидаете здесь. спасать все не хорошо. Лучше всего избавиться от всего спасения, возможно, используйте find вместо find_by_id, чтобы рельсы могли отловить эту ошибку 404, и вас это не беспокоит. С другой стороны, должна ли эта ошибка происходить много? Похоже, что-то происходит, поэтому я не ожидаю, что это не получится.

Во-вторых, я думаю, что вы должны проверить, как говорится в руководстве о raise_error http://relishapp.com/rspec/rspec-expectations/v/2-6/dir/built-in-matchers/raise-error-matcher

...