Rails ActiveSupport: ¿Cómo afirmar que se genera un error?


Quiero probar una función en uno de mis modelos que arroja errores específicos. La función se ve algo como esto:

def merge(release_to_delete)
  raise "Can't merge a release with itself!" if( self.id == release_to_delete.id )
  raise "Can only merge releases by the same artist" if( self.artist != release_to_delete.artist   )
  #actual merge code here
end

Ahora quiero hacer una afirmación de que cuando llamo a esta función con un parámetro que causa cada una de esas excepciones, que las excepciones realmente se arrojan. Estaba buscando documentación de ActiveSupport, pero no encontré nada prometedor. Alguna idea?

Author: spilliton, 2010-08-11

2 answers

Así que las pruebas unitarias no están realmente en activesupport. Ruby viene con un framework xunit típico en las libs estándar (Test:: Unit en ruby 1.8.x, MiniTest en ruby 1.9), y las cosas en activesupport solo le agregan algunas cosas.

Si está utilizando Test:: Unit / MiniTest

assert_raises(Exception) { whatever.merge }

Si está utilizando rspec (desafortunadamente mal documentado, pero mucho más popular)

lambda { whatever.merge }.should raise_error

Si quieres marcar el planteado Exception:

exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
 88
Author: Matt Briggs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-09 04:29:04

Para asegurarse de que no se genera ninguna excepción (o se maneja con éxito) haga dentro de su caso de prueba:

assert_nothing_raised RuntimeError do
  whatever.merge
end

Para comprobar que el error se plantea hacer dentro de su caso de prueba:

assert_raise RuntimeError do
  whatever.merge
end

Solo un heads up, whatever.merge es el código que genera el error (o no, dependiendo del tipo de aserción).

 10
Author: shivam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-26 08:47:32