通过 FsCheck 生成 Json 数组

Generate Json array by FsCheck

我是 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.foldGen.finalValueOf

我也不是 FsCheck 方面的专家,但我认为除了缺少函数之外,您的代码中还有一些奇怪的东西。 StringExtensions.skipLastChar 在做什么?另外,我认为 Gens 不能像您在最后一行中尝试的那样与 strings 连接起来。 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 + "\"]")