2012-06-12 16 views
14

Estoy tratando de probar una rama de controlador de Rails que se activa cuando el método del modelo genera un error.¿Cómo resuelvo un método para generar un error usando 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 

¿Cómo puedo obtener un trozo Minitest para levantar este error?

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 

Respuesta

10

Una forma de hacer esto es usar Mocha, que Rails carga por defecto.

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

Si la excepción tiene argumentos, usted tiene que proporcionar la instancia: '' 'MyObject.any_instance.expects (: my_model_method) .raises (Excepciones :: 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

Consejo profesional: Si el método que está recortando para generar una excepción tiene parámetros, debe incluirlos en su lambda: raises_exception = -> (a, b, c) {raise ArgumentError.new}. – Brad

+0

Esto funciona para mí y debería, IMO, ser la respuesta aceptada. – egeland

Cuestiones relacionadas