mocha存根有异常 - rspec测试未通过

时间:2011-05-23 00:12:12

标签: ruby-on-rails exception rspec mocha

嘿 我试图使用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 :(得分:0)

首先,如果不提供您期望的异常类,从大量代码中拯救是一种非常糟糕的习惯。救援一切都没有好处。最好删除整个救援,也许使用find而不是find_by_id,因此rails可以捕获404错误并且您不会被打扰。另一方面,这个错误是否应该发生很多?看起来有些db-stuff正在进行,所以我不希望它失败。

其次,我认为你必须像手册那样测试raise_error http://relishapp.com/rspec/rspec-expectations/v/2-6/dir/built-in-matchers/raise-error-matcher

答案 1 :(得分:0)

没有参数的

rescue将拯救StandardError及其后代。如果要捕获所有异常,则应rescue Exception,因为所有异常都来自异常类。

来源:http://www.ruby-forum.com/topic/44495