with spec run rails describe ruby-on-rails assert activesupport raise

ruby on rails - spec - Rails ActiveSupport: ¿Cómo afirmar que se ha producido un error?



rspec with rails (2)

Estoy queriendo probar una función en uno de mis modelos que arroja errores específicos. La función se ve más o menos así:

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, las excepciones realmente se lanzan. Estaba mirando la documentación de ActiveSupport, pero no encontré nada prometedor. ¿Algunas ideas?


Entonces las pruebas unitarias realmente no están en soporte activo. Ruby viene con un framework xunit típico en las librerías estándar (Test :: Unit en ruby ​​1.8.x, MiniTest en ruby ​​1.9), y las cosas en activesupport simplemente le agregan algunas cosas.

Si está usando 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 desea verificar la Exception planteada:

exception = assert_raises(Exception) { whatever.merge } assert_equal( "message", exception.message )


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 verificar que se ha producido un error, haz dentro de tu caso de prueba:

assert_raise RuntimeError do whatever.merge end

Solo un aviso, whatever.merge sea. whatever.merge es el código que genera el error (o no, según el tipo de afirmación).