簡體   English   中英

單元測試是否有異常

[英]Unit testing for exceptions

我可以用Test.HUnit編寫一個測試用例來檢查調用是否引發異常嗎?

無論打印什么消息,我都只關心它是否引發任何錯誤。

這不是特定於HUnit,但是您可以編寫一個函數來檢查IO值是否拋出:

λ> :set -XScopedTypeVariables
λ> import Control.Exception
λ> import Data.Functor
λ> import System.Environment

λ> throws io = catch (io $> False) $ \(e :: SomeException) -> pure True
throws :: IO a -> IO Bool

λ> sequence $ throws <$> [ getEnv "HOME", getEnv "whatever", error "a" ]
[False,True,True]

如果“異常”是指Exception並且它正在某些IO代碼中引發,則可以使用catchcatches 但是,如果您要用純代碼捕獲諸如error "Something bad happened" ,那么您就不走運了。 如果您願意在IO進行處理,則有更多選擇:

ghci> import Control.Exception
ghci> catch (error "Eek") (\(ErrorCallWithLocation msg _) -> putStrLn msg) 
Eek

在Haskell 2010報告第3部分中

Haskell程序將表達式評估過程中的錯誤用⊥(“底部”)表示,與未終止是無法區分的。

這是另一種思考方式:請注意,我們嘗試評估⊥值的時間(例如error "Help!" )不取決於創建此值的時間而僅取決於首次使用它的時間(因為Haskell不是-嚴格)。 捕獲此類錯誤的機制將破壞參照透明性。

暫無
暫無

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

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