setup - run test ruby
¿Cómo apago un método para generar un error usando Ruby MiniTest? (2)
Estoy intentando probar una rama del controlador Rails que se activa cuando el método del modelo genera un error.
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 talón de Minitest para provocar 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
Una forma de hacerlo es usar Mocha, que Rails carga de forma predeterminada.
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
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