2011-05-27 54 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

相關問題