【问题标题】:How can I interpret property based test code?如何解释基于属性的测试代码?
【发布时间】:2016-09-08 07:36:49
【问题描述】:

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

我正在努力翻译以下 sn-p 的说明:

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

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

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

【问题讨论】:

标签: f# property-based-testing


【解决方案1】:

此答案仅涵盖为什么使用&lt;| 而不是|&gt;

这里有 5 个示例,它们致力于将 &lt;| 用于大型函数。第 6 个示例是使用 |&gt; 而不是 &lt;| 显示代码的外观。关键是使用|&gt; 的第6 个示例,您必须查看代码以找到主要功能funThatNeedsListAndFunc,但对于&lt;|,主要功能funThatNeedsListAndFunc 是显而易见的。因此,当最后一个参数是函数时,您通常会看到 &lt;|,并且您希望在主函数之后传入该函数以便于理解。就这样;不要阅读更多内容。

在阅读了 Mark 的博客后,我还了解到 &lt;| 对于删除 ( ) 周围的 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

【讨论】:

  • 阅读 Mark 的博文后,我发现在格式化时也可以使用它来帮助。不知道那个。就像我之前提到的,一些最优秀的 F# 程序员也知道 Haskell。
  • 您是否建议我在获得 F# 专业知识之前学习 Haskell?
  • 不是以前,但可能是并行的。如果您阅读 Mark 的博客,您会看到他注意到他从 Haskell 学习了使用 &lt;|。我仍然需要尝试 Haskell,但正如您所说,我倾向于专注于数学/逻辑方面,因此更多地使用类型理论和高阶逻辑。
  • 这并不意味着我认为编程是基于数学的,而是它们是协同工作的想法。请参阅:How are programming languages and foundations of mathematics related? 这可能是我从 StackExchange 网站收到的最有用的答案,并解释了为什么应该学习 Haskell。
  • Haskell 特别是 is 数学。
猜你喜欢
  • 1970-01-01
  • 2015-09-05
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2022-01-16
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多