FsCheck生成器能否创建不断增加的序列

时间:2018-11-01 21:06:31

标签: functional-programming f# fscheck

我正在使用FsCheck生成一个生成虚假数据库记录的生成器。根据所涉及的字段,它使用choiceFromList或int,float等的生成器。

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

每一个解决方案我的FORTRAN脑子做的梦似乎都是邪恶,不纯正和程序化的。但是我认为这是比我参与的FsCheck用户更聪明的问题。这可能是函子或单子的用例...

1 个答案:

答案 0 :(得分:3)

我们可以使用递增内部计数器的函数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;}