2017-12-31 207 views
3

私はFsCheckを初めて使いました。テストを実行するにはjsonの配列が必要です。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を見つけることができないということです。

答えて

2

私もFsCheckの専門家ではありませんが、欠落している機能とは別にコード内で奇妙なことが起こっていると思います。 StringExtensions.skipLastCharは何をしているのですか?また、Genは最後の行にいるようにstringと連結することはできません。 Gen.finalValueOfは何をすべきですか?ちなみに

let jsonArray = 
    Arb.generate<string> 
    |> Gen.arrayOf 
    |> Gen.map (String.concat "\",\"") 
    |> Gen.map (fun strs -> "[\"" + strs + "\"]") 

let result = Arb.fromGen jsonArray 

:私はカンマ区切りのリストに文字列を結合し、カッコ内の結果をラップするGen.mapを使用して(それはあなたがにそれが必要なものをしなければわからない)作業あなたの例を得た

:私は生成された二重引用符を考慮する必要があると思います。エスケープしないと、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 + "\"]") 
+0

ありがとう、私は元の文字列配列も返すことができますか?私は最終的にアサーションのためにそれが必要です。 – Mohsen

+0

ここで質問を作成しました:https://stackoverflow.com/questions/48059352/how-to-generate-tuples-by-fscheck – Mohsen