Как зарегистрировать произвольный экземпляр в FsCheck, чтобы xUnit использовал его?

У меня есть тип Average с полем count, которое является положительным int64, и полем double с именем sum.

Я сделал произвольный, который генерирует действительные экземпляры с

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

Как мне заставить это генерировать аргументы с типом Average в тестах стиля Property в xUnit?

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

person nimish    schedule 28.03.2014    source источник


Ответы (2)


Я думаю, что решение Василия Кириченко является правильным, но для полноты картины Мне также удалось заставить его работать с этим стилем вызова императивной функции:

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

... если вы примете класс Generators, как в ответе Василия Кириченко.


Редактировать, намного позже...

Хотя приведенный выше императивный подход может работать, я никогда не использую его из-за его нечистой природы. Вместо этого я иногда использую Arbitrary непосредственно из теста< /а>. Со значением AverageGen выше (которое я переименую в averageGen, потому что значения должны быть в верблюжьем регистре), это может выглядеть так:

[<Property>]
let member average_test () =
    Prop.forAll averageGen (fun avg ->
        // The rest of the test goes here... )
person Mark Seemann    schedule 28.03.2014
comment
Я никогда не заставлял Arb.register работать на меня. В последнее время с Expecto я получаю, что тип MyType не обрабатывается FsCheck автоматически. Рассмотрите возможность использования другого типа или написания и регистрации генератора для него. type DomainGenerators = статический член MyType () = {новый произвольный‹MyType ›() с переопределением __.Generator = ... } do Arb.register‹DomainGenerators›() |› игнорировать [‹Tests›] ... testPropertyWithConfig config10k равенство ‹| весело (myType : MyType) -> ... - person Jack Fox; 15.04.2017
comment
Теперь я почти уверен, что моя проблема связана с ошибкой в ​​Expecto. Регистрация работает так, как я ожидаю за пределами Expecto. Я буду документировать и поднимать вопрос в ближайшее время. - person Jack Fox; 16.04.2017

person    schedule
comment
+1 А разве не должно быть new Arbitrary<Average>()...? - person Mark Seemann; 28.03.2014