2012-08-15 15 views
13

¿Cómo puedo probar una función que arroja una excepción esperada? Esta es la función que inicia la excepción:¿Cómo puedo escribir una prueba para manejar una excepción esperada?

(defn seq-of-maps? 
    "Tests for a sequence of maps, and throws a custom exception if not." 
    [s-o-m] 
    (if-not (seq? s-o-m) 
    (throw (IllegalArgumentException. "s-o-m is not a sequence")) 
    (if-not (map? (first s-o-m)) 
     (throw (IllegalArgumentException. "s-o-m is not a sequence of maps.")) 
     true))) 

Quiero diseñar una prueba como la siguiente en la que se lanza y detectó una excepción y luego comparó. El siguiente no funciona:

(deftest test-seq-of-maps 
    (let [map1 {:key1 "val1"} 
     empv [] 
     s-o-m (list {:key1 "val1"}{:key2 "val2"}) 
     excp1 (try 
       (seq-of-maps? map1) 
       (catch Exception e (.getMessage e)))] 
    (is (seq-of-maps? s-o-m)) 
    (is (not (= excp1 "s-o-m is not a sequence"))))) 

estoy recibiendo estos errores:

Testing util.test.core 

FAIL in (test-seq-of-maps) (core.clj:27) 
expected: (not (= excp1 "s-o-m is not a sequence")) 
    actual: (not (not true)) 

Ran 2 tests containing 6 assertions. 
1 failures, 0 errors.  

Obviamente, me falta algo acerca de escribir pruebas. Estoy teniendo problemas para resolverlo. Mi proyecto fue configurado con lein new, y estoy ejecutando las pruebas con lein test.

Gracias.

+0

posible duplicado de [¿Cómo espero falla en una prueba de unidad?] (Http://stackoverflow.com/questions/7852092/how-do-i-expect-failure-in-aununtest) –

Respuesta

15

La última afirmación en su prueba es incorrecta; debería ser (is (= excp1 "s-o-m is not a sequence")) ya que map1 no es una secuencia de mapas.

Aparte de eso, es probable que sea más claro usar (is (thrown? ..)) o (is (thrown-with-msg? ...)) para comprobar si hay alguna excepción.

+0

+1 a usar (arrojado? ...) – Alex

Cuestiones relacionadas