【发布时间】:2021-05-02 20:29:48
【问题描述】:
我正在努力用 HSpec 实现一个看似简单的测试问题:我想测试一个函数
myFunc :: (Exception e) a -> Either e MyRecord
在一个测试用例中,我想首先断言返回值是Right 值,然后打开该值以断言其内容。如果没有繁琐的 case 表达式,我还没有想出一种方法来做到这一点。是否存在同时允许模式匹配的断言运算符?
我正在寻找的是以下几行(伪 Haskell):
describe "myFunc" $ do
it "should return funky stuff" $ do
let result = myFunc <testArgument>
result `shouldBe` (Right testRecord)
testRecord `shouldBe` <expectedRecord>
这只是为了说明这个想法,当然,RHS 上的模式匹配不起作用。
【问题讨论】:
-
为什么
result `shouldBe` (Right testRecord)还不够?shouldBe函数有一个Eq约束,当a和b都是Eq实例时,Either只是一个Eq实例。因此,只有当Right的内容等于预期结果时,该断言才应该通过。 -
@MarkSeemann
Left类型的Either没有Eq实例不是问题所在吗?