2012-06-12 10 views
14

Ich versuche eine Rails-Controller-Verzweigung zu testen, die ausgelöst wird, wenn die Modellmethode einen Fehler auslöst.Wie stub ich eine Methode, um einen Fehler mit Ruby MiniTest auszulösen?

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 

Wie kann ich einen Minitest Stub bekommen, um diesen Fehler zu erhöhen?

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 

Antwort

10

Eine Möglichkeit, dies zu tun, ist die Verwendung von Mocha, die Rails standardmäßig lädt.

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

Wenn die Ausnahme Argumente hat, haben Sie die Instanz bieten: '' 'MyObject.any_instance.expects (: my_model_method) .raises (Ausnahmen :: 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

Profi-Tipp: Wenn die Methode, die Sie auslösen, um eine Ausnahme auszulösen, Parameter hat, müssen Sie diese in Ihr Lambda aufnehmen: raises_exception = -> (a, b, c) {raise ArgumentError.new}. – Brad

+0

Dies funktioniert für mich und sollte, IMO, die akzeptierte Antwort sein .. – egeland

Verwandte Themen