【问题标题】:FsCheck, I am not getting `Prop.forAll` to work (F#)FsCheck,我没有让 `Prop.forAll` 工作 (F#)
【发布时间】:2021-11-25 23:37:19
【问题描述】:

当我尝试使用 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个样本,这意味着没有失败。

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

【问题讨论】:

标签: f# fscheck


【解决方案1】:

如果您将测试标记为普通 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)

【讨论】:

  • 所以我所做的只是定义属性,但从不检查它。我把Prop.forAll 误认为是测试。
  • 我假设,如果我将测试标记为 Property,我可以返回一个 Prop、一个布尔值,或者只是不抛出。
  • 我认为是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
相关资源
最近更新 更多