【问题标题】:Generate Json array by FsCheck通过 FsCheck 生成 Json 数组
【发布时间】:2018-01-02 02:14:23
【问题描述】:

我是 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

【问题讨论】:

    标签: json f# fscheck


    【解决方案1】:

    我也不是 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 + "\"]")
    

    【讨论】:

      猜你喜欢
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 2020-01-14
      • 2016-04-26
      相关资源
      最近更新 更多