我正在为我的解析器编写测试,使用的方法可能不是最好的,但到目前为止一直对我有用。测试假设每个代码块都完美定义了 AST 表示,如下所示:
(parse "x = 5") `shouldBe` (Block [Assignment [LVar "x"] [Number 5.0]])
然而,当我转向更复杂的案例时,出现了对更“模糊”验证的需求:
(parse "t.x = 5") `shouldBe` (Block [Assignment [LFieldRef (Var "t") (StringLiteral undefined "x")] [Number 5.0]])
我在这个例子中放入了 undefined
来展示我不想与解析结果进行比较的字段(它是字符串文字的源位置)。现在,我看到的唯一修复方法是重写代码以使用 shouldSatisfy
而不是 shouldBe
,如果我找不到,我将不得不这样做任何其他解决方案。
最佳答案
您可以编写一个 normalizePosition
函数,用一些固定的 dummyPosition
值替换 AST 中的所有位置数据,然后使用 shouldBe
从相同的虚拟值构建的模式。
如果 AST 非常复杂,请考虑使用 Scrap-Your-Boilerplate 编写此规范化。
关于haskell - 我如何轻松地表达我不关心特定数据字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25889388/