0

我正在尝试使用 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. 我尝试在 gen 中为该Silly类型设置一个断点,但它从未被命中,所以我无法弄清楚发生了什么。

我以前在其他项目中也这样做过,但由于某种原因,我遇到了障碍。

4

1 回答 1

6

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

于 2020-04-29T17:16:27.327 回答