2011-05-27 7 views

Respuesta

18

Aunque HUnit no viene con ninguna afirmación de excepción, es fácil de escribir su propia:

import Control.Exception 
import Control.Monad 
import Test.HUnit 

assertException :: (Exception e, Eq e) => e -> IO a -> IO() 
assertException ex action = 
    handleJust isWanted (const $ return()) $ do 
     action 
     assertFailure $ "Expected exception: " ++ show ex 
    where isWanted = guard . (== ex) 

testPasses = TestCase $ assertException DivideByZero (evaluate $ 5 `div` 0) 
testFails = TestCase $ assertException DivideByZero (evaluate $ 5 `div` 1) 

main = runTestTT $ TestList [ testPasses, testFails ] 

Puede hacer algo más elegante como el uso de un predicado en lugar de comparación explícita si lo desea.

$ ./testex 
### Failure in: 1       
Expected exception: divide by zero 
Cases: 2 Tried: 2 Errors: 0 Failures: 1 

Tenga en cuenta que evaluate aquí podría obtener optimizado de distancia (ver GHC billete #5129), pero para probar el código en el IO mónada esto debería funcionar bien.

+0

Buen ejemplo. Aquí hay una versión modificada que imprime si no hay una excepción o si se trata de otra excepción http://stackoverflow.com/a/33266991/3029422 – Ionut

5

Puede usar assertRaises desde testpack.

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. – sschaef

+2

@sschaef Disculpe, novato de Haskell aquí. ¿Por qué no es la respuesta de 'testRaises' de testpack a la pregunta? – akaihola

+0

@akaihola: Ok, no estaba claro. Proporciona una respuesta, pero solo un enlace, que no es muy bienvenida en SO. – sschaef

Cuestiones relacionadas