2010-08-11 19 views
37

Estoy queriendo probar una función en uno de mis modelos que arroja errores específicos. La función es como la siguiente:Rails ActiveSupport: ¿Cómo afirmar que se ha producido un error?

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 aserción de que cuando llamo a esta función con un parámetro que hace que cada una de esas excepciones, que las excepciones en realidad son arrojados. Estaba mirando la documentación de ActiveSupport, pero no encontré nada prometedor. ¿Algunas ideas?

Respuesta

85

Por lo tanto, las pruebas unitarias no están realmente en 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á utilizando Test :: Unidad/Minitest

assert_raises(Exception) { whatever.merge } 

si está utilizando rspec (por desgracia mal documentado, pero mucho más populares)

lambda { whatever.merge }.should raise_error 

Si desea cheque el elevado Exception:

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

Gracias! Tuve que usar "RuntimeError" en lugar de excepción, así: assert_raise (RuntimeError) {artist1.merge (artist1)} Esta guía fue extremadamente útil: http://guides.rubyonrails.org/testing.html – spilliton

+1

@spilliton: Eso es porque el intérprete de Ruby trata el código anterior como 'assert_raise (Exception() {whatever.merge})', es decir, busca un método llamado 'Exception' que se llama con el bloque dado. Agregar los paréntesis resuelve esa ambigüedad. (Ya se ha corregido la respuesta) –

+0

En rspec 3, use 'expect {whatever.merge} .to raise_error' (http://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/build- in-matchers/raise-error-matcher) –

9

Para garantizar que se eleva no es una excepción (o se maneja con éxito) hacer dentro de la caja de prueba:

assert_nothing_raised RuntimeError do 
     whatever.merge 
    end 

Para comprobar que el error se eleva hacer dentro de la caja de prueba:

assert_raise RuntimeError do 
     whatever.merge 
    end 

Sí .. su ¡Tan sencillo como eso! :)

Cuestiones relacionadas