25

我正在尝试测试模型方法引发错误时触发的 Rails 控制器分支。

def my_controller_method
  @my_object = MyObject.find(params[:id])

  begin
    result = @my_object.my_model_method(params)
  rescue Exceptions::CustomError => e
    flash.now[:error] = e.message       
    redirect_to my_object_path(@my_object) and return
  end

  # ... rest irrelevant
end

如何获得 Minitest 存根来引发此错误?

it 'should show redirect on custom error' do
  my_object = FactoryGirl.create(:my_object)

  # stub my_model_method to raise Exceptions::CustomError here

  post :my_controller_method, :id => my_object.to_param
  assert_response :redirect
  assert_redirected_to my_object_path(my_object)
  flash[:error].wont_be_nil
end
4

2 回答 2

23
require "minitest/autorun"

class MyModel
  def my_method; end
end

class TestRaiseException < MiniTest::Unit::TestCase
  def test_raise_exception
    model = MyModel.new
    raises_exception = -> { raise ArgumentError.new }
    model.stub :my_method, raises_exception do
      assert_raises(ArgumentError) { model.my_method }
    end
  end
end
于 2013-11-23T15:46:12.543 回答
17

一种方法是使用 Mocha,Rails 默认加载它。

it 'should show redirect on custom error' do
  my_object = FactoryGirl.create(:my_object)

  # stub my_model_method to raise Exceptions::CustomError here
  MyObject.any_instance.expects(:my_model_method).raises(Exceptions::CustomError)

  post :my_controller_method, :id => my_object.to_param
  assert_response :redirect
  assert_redirected_to my_object_path(my_object)
  flash[:error].wont_be_nil
end
于 2012-07-27T17:43:55.177 回答