FsCheck не использует зарегистрированные Arbs/Gens

Я пытаюсь использовать FsCheck для тестирования на основе свойств, но я не могу понять, как заставить FsCheck использовать зарегистрированное мной поколение. Вот код генерации типов для домена:

module Flips.Gens

open Flips.Domain
open FsCheck

type Silly = {
    Name : string
}

let SillyGen () =
    gen {
        let! NonEmptyString name = Arb.generate<NonEmptyString>
        return { Name = name}
    }

type Domain () =
    static member ArbSillyGen () = Arb.fromGen (SillyGen ())

Вот пример теста

module Flips.Tests

open Xunit
open FsCheck
open FsCheck.Xunit
open Flips.Gens

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

module Tests =

    [<Property>]
    let ``Silly Name is NonEmptyString`` (silly:Silly) =
        let isNullOrEmpty = System.String.IsNullOrEmpty silly.Name
        Assert.True(not isNullOrEmpty)

У меня две проблемы:

  1. Похоже, что FsCheck не использует генераторы, которые я предоставил, потому что он генерирует Silly типов с пустым именем.

  2. Я пытаюсь установить точку останова в генераторе для типа Silly, но она никогда не срабатывает, поэтому я не могу понять, что происходит.

Я делал это раньше в других проектах, но по какой-то причине я натыкаюсь на кирпичную стену.


person Matthew Crews    schedule 29.04.2020    source источник


Ответы (1)


FsCheck + xunit обрабатывает произвольные операции по-другому. Согласно документации здесь, я бы попытался запустить тест путь:

Модуль Тесты =

[<Property(Arbitrary = [| typeof<Domain> |] )>]
let ``Silly Name is NonEmptyString`` (silly:Silly) =
    let isNullOrEmpty = System.String.IsNullOrEmpty silly.Name
    Assert.True(not isNullOrEmpty)

Вы можете удалить do Arb.register<Domain> () |> ignore

person Tyler Hartwig    schedule 29.04.2020