Haskell - 断言一个函数被调用

标签 haskell hunit hspec

是否可以验证函数在 Haskell HSpec 中被调用?

假设我有两个函数 foobar 来转换我的数据。

foo :: Stuff -> Stuff
bar :: Stuff -> Stuff

我有一个函数可以在 Stuff 上应用 foobar 取决于它收到的是 'f' 还是 'b' 作为它的第二个参数并返回应用函数的结果。

apply :: Stuff -> Char -> Stuff

并且在我的测试中,我已经全面测试了 foo 和 bar 中的每个函数,我不想在 apply 中测试它们的效果。

我是否可以验证函数 foo 或 bar 是否被调用?取决于传递给应用的参数是什么?

最佳答案

“我在想更多的 TDD,比如在 OOP 语言中。在 Haskell 中这样的事情可能吗?”

一个更好的问题是“Haskell 中必需这样的东西吗?” ;-)

[我知道这不是你实际问的问题。请随意忽略此答案。]

在 OO 语言中,我们构建与其他对象通信以完成其工作的对象。为了测试这样一个对象,我们构建了一堆假对象,将真实对象与假对象 Hook ,运行我们想要测试的方法,并断言它使用预期的输入调用假方法,等等。

在 Haskell 中,我们编写函数。纯函数唯一做的就是接受一些输入,并产生一些输出。所以测试的方法就是运行这个东西,给它提供已知的输入并检查它是否返回已知的输出。它在执行此操作的过程中调用了哪些其他函数并不重要;我们只关心答案是否正确。

特别是,我们通常不在 OOP 中这样做的原因是调用一些任意方法可能会导致“真正的工作”发生——读取或写入磁盘文件、打开网络连接、与数据库和其他服务器通信等. 如果您只是测试代码的一部分,您不希望测试依赖于某个数据库是否在某处的真实网络服务器上运行;您只想测试代码的一小部分。

使用 Haskell,我们将任何可能影响现实世界的事物与仅进行数据转换的事物分开。测试仅在内存中转换数据的东西非常简单! (总的来说,测试与真实世界交互的代码部分仍然很困难。但希望这些部分现在非常小。)

选择的 Haskell 测试风格似乎是基于属性的测试。例如,如果您有一个求解方程的函数,您可以编写一个随机生成 100 个方程的 QuickCheck 属性,并针对每个方程检查返回的数字是否真的求解了原始方程。这是一小部分代码,可以自动测试你想知道的一切! (但不完全是:您需要确保“随机”选择的方程式实际上测试了您关心的所有代码路径。)

关于Haskell - 断言一个函数被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25165596/

相关文章:

unit-testing - 如何测试 Haskell 中的错误?

haskell - 没有因使用 ‘shouldBe’ 而产生的 (Show a0) 实例

Haskell 中带列表的字符串替换运算符

haskell - [安全] 标记在 ghci 中是什么意思?

performance - Applicative 部分可以比 Monad 部分更好地优化的 monad 示例

unit-testing - 仅使用 Hunit 在 Haskell 中创建和运行最小测试套件

haskell - 做符号和绑定(bind)签名

unit-testing - 测试框架和 HUnit 的问题

haskell - Hspec:发现、自定义 main 以及将参数传递给规范

haskell - 将 HSpec 与堆栈结合使用