虽然在Haskell做一些TTD,我最近制定了以下功能:强制执行严格哈斯克尔
import Test.HUnit
import Data.Typeable
import Control.Exception
assertException :: (Show a) => TypeRep -> IO a -> Assertion
assertException errType fun = catch (fun >> assertFailure msg) handle
where
msg = show errType ++ " exception was not raised!"
handle (SomeException e) [...]
该函数预期异常和IO动作的类型的代表。问题是,大部分时间我都没有得到抛出的异常,即使我应该这样做,因为懒惰。通常fun
的失败部分实际上从来没有在这里评估过。
为了弥补这一点,我试图用(seq fun $ assertFailure msg)
替换(fun >> assertFailure msg)
。我还尝试启用BangPatterns扩展,并在fun
绑定之前发出一声巨响,但没有任何帮助。那么我怎么才能真正强迫Haskell严格评估fun
?
是什么*使用代码*'assertException'什么样子的? – Rufflewind 2014-10-18 22:38:53
你可能想用'try'而不是'catch'。这至少是'TestThrow'在'Test.Hspec'中实现的方式。 – Zeta 2014-10-18 23:45:44