FsCheck:生成Json数组

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.foldGen.finalValueOf
1个回答

2
我虽然不是FsCheck的专家,但我认为你的代码中除了缺少函数之外还存在一些奇怪的问题。 StringExtensions.skipLastChar 是做什么用的?此外,我认为在最后一行中你试图将Genstring连接起来是不可行的。 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 + "\"]")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接