2016-09-25 43 views
1

Подобно тому, как QuickCheck поддерживает контрпримеры:Возможно ли с помощью HSpec (или HUnit) приложить дополнительную информацию к утверждениям, которые печатаются и только в случае отказа?

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

, но таким образом, что он работает с shouldBe, например

failDetails (" details: " ++ baz a) $ 
    a `shouldBe` 2 

И я хотел бы, чтобы напечатать что-то вдоль линий:

expected: 2 
but got: 3 
details: ... 

ответ

3

Да, это представляется возможным:

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 ($>) #-}