0

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

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

并且Assignment是关联列表的类型别名,它为 a 中的每个变量提供一个布尔值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将返回 aLeft String而不是 a Rigth Wff。这会导致测试运行中止,我宁愿让少数糟糕的测试失败,而其他测试则得到实际结果。如何修改我当前的结构,以便错误传播以导致测试失败而不是一起中止?

4

1 回答 1

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]
          {- ... -}
于 2013-09-30T04:14:09.283 回答