gpt4 book ai didi

HUnit 中 ErrorCall 的 Haskell 单元测试

转载 作者:行者123 更新时间:2023-12-01 11:48:40 26 4
gpt4 key购买 nike

我有一个功能:

unify :: [Constraint] -> [Substitution]

并且在某些情况下它会抛出异常 error功能:
error "Circular constraint"

我正在使用 Test.HUnit对于单元测试,我想制作一个测试用例,断言在某些输入上抛出这些错误。我找到了 this ,它提供了一种测试异常的方法,异常是 Eq 的实例,但是 error好像给 an ErrorCall exception ,它不是 Eq 的实例,所以我得到错误:
No instance for (Eq ErrorCall)
arising from a use of `assertException'

我该如何写TestCase断言 error被调用并(最好)检查消息?

最佳答案

理想情况下,我会将您的功能重构为

unify' :: [Constraint] -> Maybe [Substitution]
unify' = -- your original function, but return Nothing instead of calling error,
-- and return Just x when your original function would return x

unify = fromMaybe (error "Circular constraint") . unify'

然后我会测试 unify'而不是测试 unify .

如果有多个可能的错误消息,我会像这样重构它:
unify' :: [Constraint] -> Either String [Substitution]
-- and return Left foo instead of calling error foo

unify = either error id . unify'

(顺便说一句,如果这是用于其他程序员将使用的库,他们中的一些人更愿意调用 unify' 而不是部分函数 unify 。)

如果你不能重构你的代码,我会修改你链接到的代码,替换 assertException和:
assertErrorCall :: String -> IO a -> IO ()
assertErrorCall desiredErrorMessage action
= handleJust isWanted (const $ return ()) $ do
action
assertFailure $ "Expected exception: " ++ desiredErrorMessage
where isWanted (ErrorCall actualErrorMessage)
= guard $ actualErrorMessage == desiredErrorMessage

关于HUnit 中 ErrorCall 的 Haskell 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com