Suppose I have a function that should calculate some value in one case and throw an exception otherwise. I would like to use QuickCheck to ensure my function behaves correctly, however is not obvious how to perform this sort of check. Is it possible and if yes, how to check that exception of certain type is thrown and it contains correct information about its cause?
Indeed ioProperty
is the key to this sort of test. You will need to use it in combination with catch
or try
. Here I show the latter:
prop_exceptional :: Int -> Property
prop_exceptional n = ioProperty $ do
result <- try . evaluate $ myDangerousFunction n
return $ r === result
where r | n == 0 = Left MyException
| otherwise = Right 42
Quite obviously, myDangerousFunction
should throw MyException
whenever it gets 0
and return 42
otherwise. Note the useful function evaluate
, which you need to use to evaluate pure function in IO
context to catch exceptions produced there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With