2012-06-12 13 views
14

Sto provando a verificare un ramo del controller Rails attivato quando il metodo model genera un errore.Come si esegue lo stub di un metodo per generare un errore utilizzando 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 

Come posso ottenere uno stub Minitest per sollevare questo errore?

risposta

10

Un modo per farlo è utilizzare Mocha, che Rails carica per impostazione predefinita.

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

Se l'eccezione ha argomenti, è necessario fornire l'istanza: '' 'MyObject.any_instance.expects (: my_model_method) .raises (Eccezioni :: 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

Suggerimento per professionisti: se il metodo che stai eseguendo lo stub per generare un'eccezione ha parametri, devi includerli nella tua lambda: raises_exception = -> (a, b, c) {raise ArgumentError.new}. – Brad

+0

Questo funziona per me e dovrebbe, IMO, essere la risposta accettata .. – egeland

Problemi correlati