首页 > 解决方案 > FsCheck 生成器能否创建不断增加的序列

问题描述

我正在使用 FsCheck 制作生成器来创建假数据库记录。根据所讨论的字段,它使用 chooseFromList 或整数、浮点数等的生成器。

但是,一个麻烦的字段是必须是顺序的主键字段。即在生成的第一条记录中放入 1,在生成的第二条记录中放入 2,依此类推。在我生成一组记录后,我将使用它们在我的测试软件中模拟一个数据库表。

我的 FORTRAN 大脑梦想的每一个解决方案似乎都是邪恶的、不纯的和程序化的。但我相信这是一个比我更聪明的 FsCheck 用户遇到的问题。这可能是函子或单子的用例......

标签: functional-programmingf#fscheck

解决方案


ident我们可以使用增加内部计数器的函数生成序列号:

type Shirt = { Collar : float; Sleeve : float; id: int }

let collars = [ 14.0; 14.5; 15.0; 15.5; 16.0; 16.5; 17.0; 17.5; 18.0; ]
let sleeves = [ 30.5; 31.5; 32.5; 33.5; 34.5; 35.5; 36.5; 37.5; 38.5]

let ident = 
    let n = ref 0
    fun () -> n := !n + 1; !n

let shirtGen =  gen {
    let! collar = Gen.elements collars
    let! sleeve = Gen.elements sleeves
    return { Collar = collar ; Sleeve = sleeve; id = ident() }
}

shirtGen
|> Gen.sample 0 10
|> List.rev
|> Seq.iter (printfn "%A")

我正在反转生成的列表,Gen.sample因为它会生成一个倒排列表。这是生成的样本:

{Collar = 14.5; Sleeve = 35.5; id = 1;}
{Collar = 15.0; Sleeve = 31.5; id = 2;}
{Collar = 16.5; Sleeve = 32.5; id = 3;}
{Collar = 17.5; Sleeve = 35.5; id = 4;}
{Collar = 16.5; Sleeve = 37.5; id = 5;}
{Collar = 14.0; Sleeve = 35.5; id = 6;}
{Collar = 18.0; Sleeve = 30.5; id = 7;}
{Collar = 16.0; Sleeve = 38.5; id = 8;}
{Collar = 17.0; Sleeve = 34.5; id = 9;}
{Collar = 14.5; Sleeve = 36.5; id = 10;}

推荐阅读