簡體   English   中英

在HUnit中對ErrorCall進行Haskell單元測試

[英]Haskell unit test for ErrorCall in HUnit

我有一個功能:

unify :: [Constraint] -> [Substitution]

在某些情況下,它會拋出error函數的異常:

error "Circular constraint"

我正在使用Test.HUnit進行單元測試,我想制作一個測試用例,斷言這些錯誤會拋出某些輸入。 我找到了這個 ,它提供了一種測試作為Eq實例的異常的方法,但是error似乎給出了一個ErrorCall異常 ,它不是Eq的實例,所以我得到了錯誤:

No instance for (Eq ErrorCall)
  arising from a use of `assertException'

如何編寫一個斷言調用error並且(最好)檢查消息的TestCase

理想情況下,我會將您的功能重構為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM