代码之家  ›  专栏  ›  技术社区  ›  Mohsen

通过FsCheck生成Json数组

  •  3
  • Mohsen  · 技术社区  · 8 年前

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Good Night Nerd Pride    8 年前

    我也不是FsCheck方面的专家,但我认为除了缺少函数之外,您的代码中还存在一些奇怪的东西。什么 StringExtensions.skipLastChar 做什么?我也不认为 Gen s可以与 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 + "\"]")