【发布时间】:2017-03-19 21:10:18
【问题描述】:
以下面的 F# 为例:
let parse mapDate mapLevel mapMessge (groups : string list) =
{
DateTime =
mapDate(
groups.[2] |> Int32.Parse,
groups.[0] |> Int32.Parse,
groups.[1] |> Int32.Parse)
Level = mapLevel groups.[3]
Message = mapMessge groups.[4]
}
我可以独立地对 map 函数进行单元测试,但这没关系,但是我如何对这个函数正确调用作为参数传入的函数进行单元测试呢?
在 C# 中,我会使用模拟并验证对它们的调用。我最近观看了一个复数视觉视频,该视频讨论了函数式语言如何倾向于使用存根而不是模拟。在这里,我可以传入一个函数,如果它没有得到预期的参数,则抛出该函数,但我并没有真正接受这种方法。
我只是想知道函数式编程中是否有任何模式可以用于单元测试这样的高阶函数?
【问题讨论】:
-
如果
parse为给定的输入返回正确的输出,那么事实上它正确地调用了它的参数函数,不是吗? -
确实如此,但我不是紧密耦合实现吗?我明白你在说什么,尽管我需要停止考虑验证函数是否被调用,并在给定一些存根的情况下纯粹断言函数的输出。
-
事实上,我认为检查某些函数是否按某种顺序调用会引入更紧密的耦合;它说'实施必须完全像这样'。所以我认为你已经掌握了窍门,开始考虑纯函数及其输入和输出。
-
不使用
mapMessge是故意的吗? -
@RobertNielsen 这是一个错字,我现在改正它。
标签: unit-testing f# functional-programming higher-order-functions