通过FsCheck生成Json数组

时间:2017-12-31 14:09:02

标签: json f# 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

1 个答案:

答案 0 :(得分:2)

我也不是FsCheck的专家,但我认为除了缺少的功能之外,你的代码中还有一些奇怪的东西。什么是StringExtensions.skipLastChar在做什么?此外,我不认为Gen可以与string串联,就像你在最后一行中所尝试的那样。什么是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 + "\"]")