如何解释基于 属性 的测试代码?

How can I interpret property based test code?

如何解释基于 属性 的测试代码?

我正在努力翻译以下片段中的说明:

let myProperty = Prop.forAll fiveAndThrees <| fun number ->

    let actual = transform number

    let expected = "jbdhjsdhjdsjhsdglsdjlljh"
    expected = actual

Check.QuickThrowOnFailure myProperty

具体来说,我正在努力处理向后管道运算符(即“<|”)。

这是测试:

[<Fact>]
let ``FizzBuzz.transform returns FizzBuzz`` () =
    let fiveAndThrees = Arb.generate<int> |> Gen.map ((*) (3 * 5)) 
                                          |> Arb.fromGen

    let myProperty = Prop.forAll fiveAndThrees <| fun number ->

        let actual = transform number

        let expected = "jbdhjsdhjdsjhsdglsdjlljh"
        expected = actual

    Check.QuickThrowOnFailure myProperty

有人可以逐步指导我了解这段代码的工作原理吗?

可以使用正向管道运算符(即“|>”)重写吗?

此答案仅涵盖为什么使用 <| 而不是 |>

这里有 5 个示例,这些示例致力于将 <| 用于大型函数。第 6 个示例是显示使用 |> 而不是 <| 的代码的外观。关键是,对于使用 |> 的第 6 个示例,您必须查看代码以找到主要功能 funThatNeedsListAndFunc,但是对于 <|,主要功能 funThatNeedsListAndFunc 是显而易见的。所以你通常会看到 <| 当最后一个参数是一个函数并且你想在主函数之后传递函数以便于理解。就这样;不要阅读更多内容。

阅读 Mark 的博客后,我还了解到 <| 有助于删除 fun 周围的 ( )。使用 ( ) 的示例在示例 7 中给出。

let funThatNeedsListAndFunc list func =
    func list

let func = List.sum
let list = Seq.toList { 0 .. 5}

let result1 = funThatNeedsListAndFunc list func

printfn "result1: %A" result1

let result2 = funThatNeedsListAndFunc list <| func

printfn "result2: %A" result2

let result3 = funThatNeedsListAndFunc list <| List.sum

printfn "result3: %A" result3

let result4 = funThatNeedsListAndFunc list <| 
    fun (list : 'a list) -> List.sum list

printfn "result4: %A" result4

let result5 = funThatNeedsListAndFunc list <| 
    fun (list : 'a list) -> 
        // This will be a long function
        let a = 1
        let b = 2
        let c = a * b
        let result = List.sum list
        let d = "more useless lines"
        let (e,f,g) = ("a", 15, 3.0)
        result

printfn "result5: %A" result5

.

let result6 = 
    fun (list : 'a list) -> 
        // This will be a long function
        let a = 1
        let b = 2
        let c = a * b
        let result = List.sum list
        let d = "more useless lines"
        let (e,f,g) = ("a", 15, 3.0)
        result
    |> funThatNeedsListAndFunc list

printfn "result6: %A" result6

.

let result7 = 
    funThatNeedsListAndFunc list (fun (list : 'a list) -> 
        // This will be a long function
        let a = 1
        let b = 2
        let c = a * b
        let result = List.sum list
        let d = "more useless lines"
        let (e,f,g) = ("a", 15, 3.0)
        result)

printfn "result7: %A" result7