2012-06-12 4 views
14

Я пытаюсь проверить ветвь контроллера Rails, которая срабатывает, когда метод модели вызывает ошибку.Как отключить метод для повышения ошибки с помощью Ruby MiniTest?

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 stub для поднятия этой ошибки?

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 

ответ

10

Один из способов сделать это - использовать 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 
+0

Если исключение имеет аргументы, вы должны предоставить экземпляр: '' 'MyObject.any_instance.expects (: my_model_method) .raises (Исключения :: CustomError.new (some_arg))' '' – Tony

14
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 
+11

Pro tip: Если метод, который вы пытаетесь создать исключение, имеет параметры, вы должны включить их в свой лямбда: raises_exception = -> (a, b, c) {raise ArgumentError.new}. – Brad

+0

Это работает для меня и должно, ИМО, быть принятым ответом .. – egeland

Смежные вопросы