Mat*_*ews 0 f# xunit fscheck property-based-testing
我正在尝试使用 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 ())
Run Code Online (Sandbox Code Playgroud)
这是示例测试
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)
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
FsCheck 似乎没有使用我提供的生成器,因为它正在生成Silly名称为空的类型。
我尝试在Silly类型的 gen 中设置断点,但它从未被击中,所以我无法弄清楚发生了什么。
我之前在其他项目中做过这个,但由于某种原因,我碰到了砖墙。
FsCheck + xunit 以不同的方式处理任意值。根据此处的文档,我会尝试以这种方式运行测试:
模块测试 =
[<Property(Arbitrary = [| typeof<Domain> |] )>]
let ``Silly Name is NonEmptyString`` (silly:Silly) =
let isNullOrEmpty = System.String.IsNullOrEmpty silly.Name
Assert.True(not isNullOrEmpty)
Run Code Online (Sandbox Code Playgroud)
你可以删除 do Arb.register<Domain> () |> ignore