2016-12-13 7 views
0

Test.HUnitでコールが例外をスローするかどうかをチェックするテストケースを記述できますか?例外のユニットテスト

印刷するメッセージに関係なく、エラーをスローするかどうかのみを気にします。

答えて

2

これは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] 
+0

これは「エラー」でも有効ですか? – cberkay

+0

はい、 'error'を使って' IO'型の値を生成していると仮定します。私はこれを含める答えを更新しました。 –

+0

ありがとうございます。あなたのコードをreplに入力すると、 'throws io = ...'のエラーが発生します: '不正な型シグネチャ:SomeException ' 型シグネチャはScopedTypeVariablesのパターンでのみ使用可能です – cberkay

2

「例外」であなたがExceptionを意味し、それはいくつかにスローされている場合IOコードの場合は、を使用できます。しかし、error "Something bad happened"のようなものを純粋なコードで捕まえることを意味するなら、あなたは不運です。 Haskellの2010年報告書から

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

section 3::⊥(「ボトムで示される式の評価中

エラー、あなたがIOで取り扱いをしても構わないと思っているなら、あなたはより多くのオプションを持っています")は、非終了からのHaskellプログラムによって区別できません。ここで

それについて考えるための別の方法です:私たちは⊥(のようなerror "Help!")の値を評価しようとする瞬間が、この値はを作成したが、が必要な最初だった場合にのみ、だったときにはない依存していることに気づきます(Haskellは非厳密なので)。この種のエラーを捕捉するメカニズムは、参照透過性を壊します。

+0

私は参照してください。残念ながら、私は 'エラー'の場合にそれを必要としました。 – cberkay

+0

@cberkay追加されました。 'IO'モナドの中にキャッチすることができる限り、可能です。 – Alec

関連する問題