2017-04-17 3 views
3
entdeckt werden kann

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!

+1

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

+0

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. –

+0

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

Antwort

5

Sie übergeben FsCheck den falschen Typ. Sie sollten es Ihre Generators Klasse übergeben, nicht Ihre ContinuousString DU. Das heißt, diese:

[<Property(Arbitrary=[| typeof<ContinuousString> |], MaxTest=2)>] 
let ``A continuous string contains no spaces`` (s: ContinuousString) = 
    s.Get.Contains " " |> not 

hätte sein sollen:

[<Property(Arbitrary=[| typeof<Generators> |], MaxTest=2)>] 
let ``A continuous string contains no spaces`` (s: ContinuousString) = 
    s.Get.Contains " " |> not 

Die FsCheck Fehlermeldung versuchte man, dies auch zu sagen:

Überprüfen Sie, ob die Art der Öffentlichkeit und hat öffentlich statische Mitglieder mit der richtigen Signatur.

Die Art, die Sie erstellt, die dem entspricht, was für Generators ist es sieht.

Verwandte Themen