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).