Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 传播错误以导致HUnit测试失败_Unit Testing_Haskell_Hunit - Fatal编程技术网

Unit testing 传播错误以导致HUnit测试失败

Unit testing 传播错误以导致HUnit测试失败,unit-testing,haskell,hunit,Unit Testing,Haskell,Hunit,我正在为函数编写HUnit测试eval::Wff->Assignment->mayboolWff是一种自定义数据类型,是布尔表达式简化子集的抽象解析树: data Wff = Var Name | Not Wff | Or Wff Wff deriving (Eq) 而Assignment是关联列表的类型别名,它为Wff中的每个变量提供布尔值: type Assignment = [(Name, Bool)] 我当前的测试如下所示: te

我正在为函数编写HUnit测试
eval::Wff->Assignment->maybool
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"
testEval::Test
testEval=“测试评估”
~:TestList$zipWith(\e(仅a)->e~=?a)预期(评估wff分配)
其中预期=[正确,错误]
赋值=[('p',True)],[('p',False)]]
右wff=解析wffStr
wffStr=“p”

这两项测试都通过了。然而,该测试并不十分可靠。如果我为
wffStr
修改了一个更复杂的值,但输入了一个打字错误,模式
Right wff
将失败,因为
parse
将返回一个
Left String
,而不是
Right wff
。这会导致测试运行中止,我更愿意看到一些错误测试的失败和其他测试的实际结果。如何修改当前结构,使错误传播,导致测试失败,而不是一起中止?

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

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]
          {- ... -}

这看起来是一个令人满意的解决方案。谢谢你的建议。我的问题可能更多的是混合单子,而不是混合单子。也许我需要找到一种方法来重新表述我的问题,以强调我正在使用一个
字符串
单子以及一个
可能
单子列表。我肯定有一些很好的方法来处理这个问题,但我还没有找到。