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