2017-12-31 83 views
3

Ich bin neu bei FsCheck und ich brauche ein Array von Json, um meine Tests durchzuführen.Generiere Json Array von FsCheck

Ich möchte eine einfache Lösung wie folgt aus:

let commaSeparated = Gen.arrayOf Arb.generate<string> 
         |> Gen.fold(fun (acc,i)-> i+="\",\"") 
         |> Gen.finalValueOf 
         |> StringExtensions.skipLastChar 
let result = Arb.from "[\"" + commaSeparated +"\"]" 

Aber das Hauptproblem ist, dass ich nicht Gen.fold und Gen.finalValueOf finden.

Antwort

2

Ich bin auch kein Experte für FsCheck, aber ich denke, abgesehen von den fehlenden Funktionen gibt es einige seltsame Dinge in Ihrem Code. Was macht StringExtensions.skipLastChar? Auch glaube ich nicht Gen s kann mit string s wie Sie versuchen, in der letzten Zeile verkettet werden. Was soll Gen.finalValueOf tun?

ich dein Beispiel bekam Arbeit (nicht sicher, ob es das tut, was Sie brauchen, um es zu) Gen.map mit den Strings in eine kommagetrennte Liste und wickeln Sie das Ergebnis in Klammern zu verbinden:

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

let result = Arb.fromGen jsonArray 

By the way: Ich denke, Sie müssen doppelte Anführungszeichen berücksichtigen. Wenn Sie ihnen nicht entkommen, wird Ihr JSON-Parser fehlschlagen. Unten ist eine Version von jsonArray, die das tut:

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

Danke, weißt du, wie kann ich die ursprüngliche String-Array auch zurück? Ich brauche es endlich zur Behauptung. – Mohsen

+0

Ich habe die Frage hier erstellt: https://stackoverflow.com/questions/48059352/how-to-generate-tuples-by-fscheck – Mohsen