为什么我的基于属性的测试会忽略我的前提条件?

时间:2016-03-22 02:07:47

标签: f# property-based-testing

为什么我的基于属性的测试会忽略我的前提条件?

我的测试的前提条件如下:

fun rowCount -> rowCount >= 0

因此,我的实际测试是:

[<Fact>]
let ``number of cells in grid equals rowcount squared`` () =
    Check.QuickThrowOnFailure <| 
            fun rowCount -> rowCount >= 0 ==>  
                            fun rowCount -> rowCount |> createGrid
                                                     |> Map.toList
                                                     |> List.length = rowCount * rowCount

但是,我的测试仍然失败:

  

结果消息:System.Exception:3次测试后可证伪(1   缩水)(StdGen(985619705,296133555)):原文:1   -1收缩:0   -1

let createGrid rowCount = 

    [for x in 0..rowCount-1 do
        for y in 0..rowCount-1 do
            yield { X=x; Y=y; State=Dead } 
    ]|> List.map (fun c -> (c.X, c.Y), { X=c.X; Y=c.Y; State=Dead })
     |> Map.ofList

[UPDATE]

我也尝试过:

let precondition rowCount =
    rowCount >= 0

let ``some property`` rowCount = 

    precondition rowCount ==> rowCount |> createGrid 
                                       |> Map.toList
                                       |> List.length = rowCount * rowCount
[<Fact>]
let ``number of cells in grid equals rowcount squared`` () =
    Check.QuickThrowOnFailure <| ``some property``

但是,我收到以下错误:

  

类型不匹配。期待一个       财产 - &gt; &#39; a但给出了一个       int - &gt; Map&lt;(int * int),Cell&gt;类型&#39;属性&#39;与&#39; int&#39;

类型不匹配

1 个答案:

答案 0 :(得分:3)

正如@FyodorSoikin在评论中指出的那样,你有两个嵌套函数,每个函数都取rowCount

第二个 rowCount值会影响第一个,但==>前提条件功能仅适用于第一个 rowCount值。因此,实际用于测试的rowCount值仍然是无限的。

使测试更简单,并且它将起作用:

open Xunit
open FsCheck

[<Fact>]
let ``number of cells in grid equals rowcount squared`` () =
    Check.QuickThrowOnFailure <| fun rowCount ->
        rowCount >= 0 ==>  
        (rowCount
            |> createGrid
            |> Map.toList
            |> List.length = rowCount * rowCount)