在F#中对高阶函数进行单元测试

Con*_*nel 9 f# unit-testing functional-programming higher-order-functions

采用以下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]
    }
Run Code Online (Sandbox Code Playgroud)

我可以单独单独测试map函数,但是我如何单元测试这个函数正确调用作为参数传入的函数?

在C#中,我会使用模拟并验证对它们的调用.我最近观看了一个复杂的视频,讨论了函数式语言如何使用存根而不是模拟.在这里我可以传入一个抛出的函数,如果它没有得到预期的参数,但我并没有真正卖掉这种方法.

我只是想知道函数式编程中是否有任何模式用于单元测试这样的高阶函数?

Kar*_*ldt -1

纯函数更容易,因为您只需测试函数的输出parse。您不需要像在命令式编程中那样使用副作用进行测试。

在编写大多数单元测试时,您通常会使用最简单的函数参数,例如identity类似的参数。然后,您将编写一个名为“mapLevel 应用于第四组”之类的测试,而不是编写mapLevel一些易于识别为已更改的内容,例如toUpper. 这可以让您确保不会意外地复制/粘贴mapLevel到多个输出。然后进行类似的测试mapMessge