FsCheck не использует зарегистрированные Arbs / Gens - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь использовать 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, но он никогда не срабатывает, поэтому я не могу понять, что происходит.

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

1 Ответ

5 голосов
/ 29 апреля 2020

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

...