与quickcheck如何支持反例类似:

property \x ->
  counterexample ("Foo failed with: " ++ ...) $
    foo x

但以某种方式与shouldBe配合使用,例如
failDetails (" details: " ++ baz a) $
  a `shouldBe` 2

我希望它按照以下方式打印一些内容:
expected: 2
 but got: 3
 details: ...

最佳答案

是的,似乎有可能:

import Control.Exception
import Test.HUnit.Lang (HUnitFailure(..))

failDetails details assert = do
  assert `catch` \(HUnitFailure loc msg) -> do
    throw $ HUnitFailure loc $ msg ++ "\n" ++ details

我们捕获了shouldBe引发的异常,修改了消息,然后将其重新抛出。

我们甚至可以像这样使用它:
1 `shouldBe` 2
  $> failDetails "foobar"

如果我们定义:
($>) = flip ($)
infixl 0 $>
{-# INLINE ($>) #-}

09-03 19:56