2011-05-27 28 views

回答

18

虽然HUnit不附带任何异常的断言,可以很容易地编写自己:

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 ] 

你可以做一些更看中的一样,如果你喜欢用一个谓语,而不是明确的比较。

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

注意evaluate这里可能会被优化掉(参见GHC票#5129),但在IO单子测试代码这应该很好地工作。

+0

不错的例子。这是一个修改后的版本,打印如果没有异常或者是另一个异常http://stackoverflow.com/a/33266991/3029422 – Ionut 2015-10-22 13:47:05

5

您可以从testpack使用assertRaises

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – sschaef 2012-11-13 13:54:44

+2

@sschaef对不起,Haskell新手在这里 - 为什么testpack的assertRaises不是这个问题的答案? – akaihola 2013-02-10 06:15:41

+0

@akaihola:好的,我不清楚。它提供了一个答案,但只有一个链接的答案,这是不是很受欢迎的SO。 – sschaef 2013-02-10 11:08:35

相关问题