为什么我的基于属性的测试会忽略我的前提条件?
我的测试的前提条件如下:
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;
类型不匹配
答案 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)