2014-03-28 4 views
6

Ich habe einen Typ Average mit einem Feld count, das ist ein positives int64 und ein double Feld namens sum.Wie registriere ich eine willkürliche Instanz in FsCheck und habe sie xUnit benutzen?

Ich machte einen beliebigen gültigen Instanzen mit

let AverageGen = Gen.map2 (fun s c -> Average(float(s),int64(int(c))) (Arb.Default.NormalFloat().Generator) (Arb.Default.PositiveInt().Generator) |> Arb.fromGen 

erzeugt Wie bekomme ich diese in Property Stil Tests in xUnit mit Durchschnitt erzeugen Argumente zu sein?

[<Property>] 
static member average_test(av:Average) = ... 

Antwort

8
type Generators = 
    static member TestCase() = 
     { new Arbitrary<TestCase>() with 
      override x.Generator = 
       gen { ... 
         return TestCase(...) }} 

[<Property(Arbitrary=[|typeof<Generators>|])>] 
+2

+1 Aber sollte es nicht sein 'neuen Arbitrary () .. .'? –

+0

C#: '[Eigenschaft (Arbitrary = neuer Typ [] {typeof (Generatoren)})]' –

4

denke ich Vasily Kirichenko-Lösung die richtige ist, aber nur für Vollständigkeit halber, I've also been able to make it work with this imperative function invocation Stil:

do Arb.register<Generators>() |> ignore 

... wenn Sie davon ausgehen, eine Generators Klasse wie in Vasily Kirichenko Antwort .


bearbeiten, viel später ...

Während der oben kann Imperativ Ansatz arbeiten, ich es nie wegen seiner unreinen Natur verwenden. Stattdessen habe ich manchmal use the Arbitrary directly from within the test. Mit dem AverageGen Wert über (die ich zu averageGen umbenennen werden, da die Werte sollten camelcased werden), es könnte wie folgt aussehen:

[<Property>] 
let member average_test() = 
    Prop.forAll averageGen (fun avg -> 
     // The rest of the test goes here...) 
+0

Ich habe nie Arb.register für mich arbeiten lassen. Kürzlich mit Expecto bekomme ich "Der Typ MyType wird nicht automatisch von FsCheck behandelt. Erwägen Sie, einen anderen Typ zu verwenden oder einen Generator dafür zu schreiben und zu registrieren." Typ DomainGenerators = statisches Element MyType() = {new Willkürliche () mit Überschreibung __ Generator = ... .} do Arb.register () |> ignorieren [ ] ... \t testPropertyWithConfig config10k "Gleichheit" <| Spaß (myType: MyType) -> ... –

+1

Ziemlich sicher, jetzt ist mein Problem ein Fehler in Expecto. Die Registrierung funktioniert so, wie ich es außerhalb von Expecto erwarte. Ich werde bald ein Problem dokumentieren und melden. –

Verwandte Themen