任何Haskell测试框架中是否存在assertException?

我正在使用HUnit编写一些测试,并且我想断言某个特定的函数会在给定输入时抛出异常。 我无法找到提供所需功能的断言函数。 任何人都知道一个测试框架呢?


尽管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 monad中的代码,这应该可以正常工作。


你可以使用testpack中的assertRaises


hspec(或者更准确地说是hspec-expectations)已经shouldThrow

链接地址: http://www.djcxy.com/p/66713.html

上一篇: Is there an assertException in any of the Haskell test frameworks?

下一篇: Should I use bindParam(), bindValue(), or execute() for PDO prepared statements