2015-10-31 27 views
4

假設我有一個函數應該在一種情況下計算一些值,否則 會拋出異常。我想使用QuickCheck來確保我的 函數的行爲正確,但不清楚如何執行此類排序 的檢查。是否有可能,如果是的話,如何檢查某些 類型的異常是否被拋出,並且它包含有關其原因的正確信息?是否有可能檢查使用QuickCheck引發異常的情況?

+1

我想你說的是'Control.Exception'吧?在這種情況下,顯而易見的事情是使用['catch'](https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Exception-Base.html#v:catch)和['ioProperty'](https://hackage.haskell.org/package/QuickCheck-2.8.1/docs/Test-QuickCheck-Property.html#t:ioProperty)(用於quickCheck) – Carsten

+0

@Carsten,good,catch ''或'try'與'ioProperty'結合應該可以做到。 – Mark

回答

0

確實ioProperty是這種測試的關鍵。您需要結合使用catchtry。在這裏,我爲後者:

prop_exceptional :: Int -> Property 
prop_exceptional n = ioProperty $ do 
    result <- try . evaluate $ myDangerousFunction n 
    return $ r === result 
    where r | n == 0 = Left MyException 
      | otherwise = Right 42 

很明顯,myDangerousFunction應該拋出MyException一旦進入0並返回42否則。請注意有用的函數evaluate,您需要使用它來評估IO上下文中的純函數以捕獲那裏產生的異常。

相關問題