传播错误导致HUnit测试失败

时间:2013-09-30 00:59:56

标签: unit-testing haskell hunit

我正在为函数eval :: Wff -> Assignment -> Maybe Bool编写一个HUnit测试。 Wff是一个自定义数据类型,它是一个简化的布尔表达式子集的抽象解析树:

data Wff = Var Name
         | Not Wff
         | Or Wff Wff
         deriving (Eq)

Assignment是关联列表的类型别名,它为Wff中的每个变量提供布尔值:

type Assignment = [(Name, Bool)]

我目前的测试如下:

testEval :: Test
testEval = "Test eval"
        ~: TestList $ zipWith (\e (Just a) -> e ~=? a) expected (eval wff <$> assignments)
    where expected = [True, False]
          assignments = [[('p', True)], [('p', False)]]
          Right wff = parse wffStr
          wffStr = "p"

两个测试构建都通过了。但是,测试不是很强大。如果我使用wffStr更复杂的值修改它,但输入错误,则模式Right wff将失败,因为parse将返回Left String而不是Rigth Wff }。这导致测试运行中止,我宁愿为少数错误测试和其余的实际结果失败。如何修改当前结构以便错误传播以导致测试失败而不是一起中止?

1 个答案:

答案 0 :(得分:1)

我对HUnit一无所知,但是:你能告诉它在解析失败时该怎么做吗?

testEval = case parse wffStr of
    Left _ -> {- use HUnit's functions to make a failing test case -}
    Right wff -> "Test eval" ~: TestList $ {- ... -}
    where expected = [True, False]
          {- ... -}