Заставить FsCheck сгенерировать NonEmptyString для различения полей объединения типа string
Я пытаюсь добиться следующего поведения с помощью FsCheck: я хотел бы создать генератор, который будет генерировать экземпляр MyUnion
тип, причем каждое строковое поле не пусто
type MyNestedUnion =
| X of string
| Y of int * string
type MyUnion =
| A of int * int * string * string
| B of MyNestedUnion
Мой "настоящий" тип намного больше / глубже, чем MyUnion
и FsCheck может генерировать экземпляр без каких-либо проблем, но строковые поля случаев объединения иногда бывают пустыми. (Например, это может генерировать B (Y (123, ""))
)
Возможно, есть какой-то очевидный способ объединения FsCheck NonEmptyString
и его поддержка генерации произвольных типов объединений, которые мне не хватает?
Любые советы / указатели в правильном направлении с благодарностью.
Спасибо!
1 ответ
Это идет вразрез с тестированием на основе свойств (в том смысле, что вы явно предотвращаете создание допустимых тестовых случаев), но вы можете подключить генератор непустых строк, который будет использоваться для всех строк:
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
Обратите внимание, что вам нужно будет повторно зарегистрировать генератор по умолчанию после теста, поскольку сопоставления являются глобальными.
Более подходящим решением было бы использовать производный генератор по умолчанию и затем фильтровать значения, которые содержат недопустимые строки (т.е. использовать ==>
), но вы можете найти это неосуществимым для особенно глубоко вложенных типов.