Заставить 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

Обратите внимание, что вам нужно будет повторно зарегистрировать генератор по умолчанию после теста, поскольку сопоставления являются глобальными.

Более подходящим решением было бы использовать производный генератор по умолчанию и затем фильтровать значения, которые содержат недопустимые строки (т.е. использовать ==>), но вы можете найти это неосуществимым для особенно глубоко вложенных типов.

Другие вопросы по тегам