FsCheck,我没有让 `Prop.forAll` 工作 (F#)

FsCheck, I am not getting `Prop.forAll` to work (F#)

当我尝试使用 Prop.forAll 时,我无法正确使用 FsCheck。

我已经创建了两个测试来演示我在做什么,希望它们都失败。

type Data = { value: int }

type NeverAOne =
    static member Data () =
        Arb.generate<int>
        |> Gen.filter (fun x -> x <> 1)
        |> Gen.map (fun x -> { value = x })
        |> Arb.fromGen

[<Property(Arbitrary = [| typeof<NeverAOne> |] )>] (* Fails *)
let ``Test One`` (x: Data) =
    x.value = 1

[<Fact>]
let ``Test Two`` () = (* Passes *)
    Prop.forAll (NeverAOne.Data ()) (fun x -> x.value = 1)

在此示例中,测试两项 通过。如果我添加断点,我可以看到是因为没有生成数据,所以它迭代了 0 个样本,这意味着 none 失败。

我确信我使用的 Prop.forAll 是错误的,但是尽管我通读了所有内容,但还是找不到它。

如果将测试标记为普通 Xunit Fact(而不是 FsCheck Property),则必须明确检查 属性:

[<Fact>]
let ``Test Two`` () =
    let prop = Prop.forAll (NeverAOne.Data ()) (fun x -> x.value = 1)
    Check.QuickThrowOnFailure prop

我得到的结果是:

System.Exception : Falsifiable, after 1 test (0 shrinks) (StdGen (74764374, 296947750)):
Original:
{ value = -2 }

或者您可以将测试标记为 Property,当然:

[<Property>]
let ``Test Three`` () =
    Prop.forAll (NeverAOne.Data ()) (fun x -> x.value = 1)