3

関数をテストするQuickCheckプロパティがありますffプロパティは、関数をいくつかのリストにマップしxs、結果の要素ごとのプロパティをチェックします。xs失敗した場合は、この失敗に関連する要素を表示したいと思います。次のプロパティを検討してください。

prop x =
    printTestCase ("Failed for value " ++ show failure) $ isNothing failure
  where
    failure = fmap fst $ find (not . snd) $ map (\n -> (n, f x n == n)) [10..20]

これは実装には問題なく機能します

f = (+)

およびquickcheck prop出力

*** Failed! Falsifiable (after 2 tests):                  
1
Failed for value Just 10

ただし、f例外をスローした場合、つまり

f = undefined

その後、quickcheck prop出力

*** Failed! Exception: 'Prelude.undefined' (after 1 test): 
()
Failed for value Exception thrown by generator: 'Prelude.undefined'

前の例のように、この2番目の例外をキャッチして「Just0」を返すプロパティを作成するにはどうすればよいですか?whenFailおそらく、これを使用することもできますwhenFail'が、QuickCheckの内部をまだ理解していません。

4

1 に答える 1

0

#haskellチャネルのaavogtのおかげで、Control.Spoonこの問題を解決するために使用できる機能スプーンとティースプーンを提供するモジュールを見つけました。ただし、このパッケージ(を使用)を使用することがどれほど安全かはわかりませんunsafePerformIO internally

とにかく、を使用してControl.Spoonprop次のように書き直すことができます。

prop x =
    printTestCase ("Failed for value " ++ show pureFailure) $ isNothing excFailure
  where
    pureFailure = failure (fromMaybe True . teaspoon)
    excFailure = failure id
    failure g = fmap fst $ find (g . not . snd) $ map (\n -> (n, f x n == n)) [10..20]

find述部をでラップすると、findは述語をfromMaybe True . teaspoon満たすか、例外をスローする最初の要素を返すという効果があります。

teaspoon例外が発生したことを確認するためにのみ使用できますが、例外が発生したことを確認するためにのみ使用できる excFailureため、QuickCheckが引き続き例外を確認できるようにここで使用します。欠点は、検索結果を2回評価する必要があることです。teaspoonWHNFに対してのみ評価されます。例外をトリガーするために詳細な評価が必要な場合は、spoon代わりに使用してください。

teaspoonいくつかの選択された例外のみをキャッチします。これは、未定義で網羅的でないパターンの一致のみを本当に気にするため、私にとっては問題ありません。

于 2012-12-05T01:12:45.917 に答える