2
私はハスケルを学んでおり、私はTDDをしたいです。 関数が予期される例外を発生させるかどうかをテストしようとしています。 私はHUnitとtestpackを使用しています。HaskellでtestpackからassertRaisesを使用するには?
testpackがassertRaises機能を提供しますが、私は私のコードをコンパイルするために管理していない:(
ここに私のソースコードは次のとおりです。
module Main where
import Test.HUnit
import Test.HUnit.Tools
import Control.Exception
foo n | n > 2 = throw (IndexOutOfBounds ("Index out of bounds : " ++ (show n)))
foo n | otherwise = n
testException = TestCase(assertRaises "throw exception" (IndexOutOfBounds "Index out of bounds : 4") (foo 4))
main = runTestTT (TestList [ testException ])
私はGHCでコンパイルしたとき、私は、次のエラーメッセージが表示されます:
test_exceptions.hs:10:107:
No instance for (Ord (IO a0))
arising from a use of `foo'
Possible fix: add an instance declaration for (Ord (IO a0))
In the third argument of `assertRaises', namely `(foo 4)'
In the first argument of `TestCase', namely
`(assertRaises
"throw exception"
(IndexOutOfBounds "Index out of bounds : 4")
(foo 4))'
In the expression:
TestCase
(assertRaises
"throw exception"
(IndexOutOfBounds "Index out of bounds : 4")
(foo 4))
test_exceptions.hs:10:111:
No instance for (Num (IO a0))
arising from the literal `4'
Possible fix: add an instance declaration for (Num (IO a0))
In the first argument of `foo', namely `4'
In the third argument of `assertRaises', namely `(foo 4)'
In the first argument of `TestCase', namely
`(assertRaises
"throw exception"
(IndexOutOfBounds "Index out of bounds : 4")
(foo 4))'
何が問題になっています
私はここで怠惰のために 'return'が動作しないと思います。しかし、「評価する」は仕事をしなければならない。 – hammar
@ハマーどのように私のぞっとする。ありがとう。 – dave4420
@ dave4420ありがとう:) –