【发布时间】:2014-08-06 16:35:44
【问题描述】:
是否可以验证 Haskell HSpec 中是否调用了函数?
假设我有两个函数 foo 和 bar 可以转换我的数据。
foo :: Stuff -> Stuff
bar :: Stuff -> Stuff
我有一个函数可以在 Stuff 上应用 foo 或 bar,具体取决于它是否收到 'f' 或 'b' 作为它的第二个参数并返回应用函数的结果。
apply :: Stuff -> Char -> Stuff
在我的测试中,我已经全面测试了每个函数 foo 和 bar,我不想在 apply 中测试它们的效果。
我是否可以验证函数 foo 或 bar 是否被调用?取决于传递给应用的参数是什么?
【问题讨论】:
-
你不能在
foo和bar的正文中写一个print或类似的语句,看看哪个被调用了吗?你加载了哪些 monad? -
如果你是纯函数式的,你不应该能够观察到你是否正在执行一个函数,或者执行了多少次(因为调用函数不应该有任何副作用,并且观察到你已经执行了这确实是一个副作用)。虽然我对 ruby-rspec 或 hspec 了解不多,所以我不确定,但是在纯函数式语言中,如果你不能区分两个返回值,你实际上是在调用同一个函数
-
基本上,如果您将元数据添加到返回值以识别已调用的元数据,则您正在执行单子转换:如果您使用
do语法,haskell 中的单子会透明地执行此类操作.如果您找到答案并且满意,您应该在此处写下并接受它,以供将来参考 -
如果你只是将它用于调试而不是生产代码,你可以稍微作弊并使用
Debug.Trace。 -
您肯定确实想要测试返回值(因为这就是您应该关心的全部)。基本上
foo x = apply x 'f'用于一些合适的x和bar/y 相同。