ich einen FSCheck Generator Ich schreibe Strings erstellen, um die folgenden Eigenschaften:Wie definiere ich einen FSCheck Generator, so dass es
- Sie sind nicht-null
- sie Trimmen wird nicht beeinflussen die Länge
- Sie enthalten keine Leerzeichen.
Hier ist mein Generator Code:
namespace Example
open FsCheck.Arb
module public Generation =
let hasChars (s : string) =
(isNull s |> not)
&& s.Length > 0
let isTrimmed (s : string) =
s.Trim().Length = s.Length
let isContinuous (s : string) =
s
|> Seq.exists ((=) ' ')
|> not
[<AbstractClass; Sealed>]
type public Generators = class end
type public ContinuousString = ContinuousString of string with
member x.Get = match x with ContinuousString r -> r
override x.ToString() = x.Get
type public Generators with
static member ContinuousString() =
Default.String()
|> filter hasChars
|> filter isTrimmed
|> filter isContinuous
|> convert ContinuousString string
Und hier ist ein Test soll die Erzeugung überprüfen:
[<Property(Arbitrary=[| typeof<ContinuousString> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
Wenn ich diesen Test ausführen, erhalte ich:
System.Exception: No instances found on type Example.Generation+ContinuousString. Check that the type is public and has public static members with the right signature.
Soweit ich das mit dem FSCheck-Quellcode feststellen kann, habe ich das Mitglied de fined sollte durch den Discovery-Filter gefunden werden, und die Methode scheint analog zu ähnlichen integrierten wie NonEmptyString
zu sein.
Was habe ich verpasst? Vielen Dank!
Ich denke 'typeof' sollte 'typeof ' sein. Außerdem denke ich nicht, dass Sie es zweimal definieren müssen: Die Definition von "type public Generators = class end" tut nichts für Sie, AFAIK. –
rmunn
Auch: 'isNull s |> not 'könnte einfach' s <> null' sein. Außerdem: 'ContinuousString.Get' ist eine Eigenschaft, wird aber wie eine Methode benannt. Außerdem: Sie brauchen nicht 'Get', Sie könnten den Parameter der Testfunktion als '(ContinuousString s)' anstelle von '(s: ContinuousString)' definieren. –
Großartig, danke @rmunn! Der korrigierte 'typeof <>' hat es behoben. Der leere Typ war gerade da, also replizierte ich den Code von FSCheck so genau wie möglich - ich hatte nicht erwartet, dass er einen Effekt hat. Wenn Sie Ihren Kommentar zu einer Antwort übertragen möchten, werde ich als akzeptiert markieren. Danke noch einmal! – Kit