2017-08-15 12 views
7

Próbuję osiągnąć następujące zachowanie z FsCheck: Chciałbym utworzyć generator, który wygeneruje instancję typu MyUnion, z każdym polem łańcuchowym jest nie -null/empty.Siła FsCheck do generowania NonEmptyString dla dyskryminujących pól unii typu string

type MyNestedUnion = 
    | X of string 
    | Y of int * string 

type MyUnion = 
    | A of int * int * string * string 
    | B of MyNestedUnion 

My „prawdziwym” typu jest znacznie większy/głębiej niż MyUnion i FsCheck jest w stanie wygenerować instancję bez problemu, ale pola String przypadkach związków są czasem puste. (Na przykład może wygenerować B (Y (123, "")))

Być może jest jakiś oczywisty sposób połączenia FsCheck z NonEmptyString i jego wsparcie dla generowania arbitralnych typów związków, których mi brakuje?

Wszelkie wskazówki/wskazówki w dobrym kierunku bardzo docenione.

Dzięki!

Odpowiedz

5

to idzie na przekór testów opartych nieruchomości (w jawnie uniemożliwić prawidłowe przypadków testowych z generowane), ale można drut aż niepusty generator ciąg mają być stosowane do wszystkich ciągów:

type Alt = 
    static member NonEmptyString() : Arbitrary<string> = 
     Arb.Default.NonEmptyString() 
     |> Arb.convert 
      (fun (nes : NonEmptyString) -> nes.Get) 
      NonEmptyString.NonEmptyString 

Arb.register<Alt>() 

let g = Arb.generate<MyUnion> 

Gen.sample 1 10 g 

Należy zauważyć, że po zakończeniu mapowania konieczne jest ponowne zarejestrowanie domyślnego generatora, ponieważ odwzorowania są globalne.

Bardziej podręcznym rozwiązaniem byłoby użycie domyślnego generatora pochodnego, a następnie filtrowanie wartości zawierających niepoprawne ciągi (to jest użycie ==>), ale może się okazać, że nie jest to możliwe w przypadku typów głęboko zagnieżdżonych.

Powiązane problemy