我有一些规范(用HSpec编写),并希望有一个测试,检查某些功能的重新导出是否按预期进行。
代码:
https://github.com/Wizek/compose-ltr/blob/ab954f00beb56c6c1a595261381d40e7e824e3bc/spec/Spec.hs#L4
如果我进入这个文件,如果我手动切换第4行或第5行被注释掉,我可以使用import运行所有测试。是否有一种简单的方法可以确保两个模块都导出相同的功能?
我想到的第一件事是导入一个合格的模块,并检查是否相等:
(($>) == (ComposeLTR.$>)) `shouldBe` True
-- Or more succintly
($>) `shouldBe` (ComposeLTR.$>)
但这不起作用,因为函数不能直接比较,它们不属于Eq
类型类。
我能想到的唯一可以自动运行的是导入限定并为所有4个函数定义QuickCheck属性,如下所示:
import qualified ComposeLTR
it "should re-export the same function" $ do
let
prop :: (Fun Int Int) -> Int -> Bool
prop (Fun _ f) g = (g $> f) == (g ComposeLTR.$> f)
property prop
-- ... Essentially repeated 3 more times
但这看起来非常冗长和多余。是否有一种优雅的方式来检查这个?
答案 0 :(得分:1)
您可以在IO中使用StableName
:
Prelude Data.List System.Mem.StableName> v <- makeStableName Prelude.takeWhile
Prelude Data.List System.Mem.StableName> v' <- makeStableName Data.List.takeWhile
Prelude Data.List System.Mem.StableName> v == v'
True