3

我是 FsCheck 的新手,我需要一个 json 数组来执行我的测试。

我想要一个简单的解决方案,如下所示:

let commaSeparated =  Gen.arrayOf Arb.generate<string> 
                      |> Gen.fold(fun (acc,i)-> i+="\",\"")
                      |> Gen.finalValueOf
                      |> StringExtensions.skipLastChar
let result = Arb.from "[\"" + commaSeparated +"\"]"

但主要问题是我找不到Gen.foldand Gen.finalValueOf

4

1 回答 1

2

我也不是 FsCheck 方面的专家,但我认为除了缺少的函数之外,您的代码中还有一些奇怪的东西。在做什么StringExtensions.skipLastChar?另外,我认为Gens 不能string像您在最后一行中尝试的那样与 s 连接。应该怎么Gen.finalValueOf做?

我让您的示例正常工作(不确定它是否符合您的需要),Gen.map用于将字符串连接到逗号分隔列表并将结果括在括号中:

let jsonArray = 
    Arb.generate<string>
    |> Gen.arrayOf  
    |> Gen.map (String.concat "\",\"")
    |> Gen.map (fun strs -> "[\"" + strs + "\"]")

let result = Arb.fromGen jsonArray

顺便说一句:我认为您需要考虑生成的双引号。如果您不转义它们,您的 JSON 解析器将会失败。下面是jsonArray这样做的一个版本:

let escapeDoubleQuotes (str:string) = str.Replace ("\"", "\\\"")

let jsonArray = 
    Arb.generate<string>
    |> Gen.arrayOf
    |> Gen.map (Array.map escapeDoubleQuotes)
    |> Gen.map (String.concat "\", \"")
    |> Gen.map (fun strs -> "[\"" + strs + "\"]")
于 2018-01-01T18:04:41.047 回答