如何定义 FSCheck 生成器以便可以发现它
How do I define an FSCheck generator so that it can be discovered
我正在编写一个 FSCheck 生成器来创建具有以下属性的字符串:
- 它们是非空的
- 修剪它们不会影响长度
- 它们不包含空格。
这是我的生成器代码:
namespace Example
open FsCheck.Arb
module public Generation =
let hasChars (s : string) =
(isNull s |> not)
&& s.Length > 0
let isTrimmed (s : string) =
s.Trim().Length = s.Length
let isContinuous (s : string) =
s
|> Seq.exists ((=) ' ')
|> not
[<AbstractClass; Sealed>]
type public Generators = class end
type public ContinuousString = ContinuousString of string with
member x.Get = match x with ContinuousString r -> r
override x.ToString() = x.Get
type public Generators with
static member ContinuousString() =
Default.String()
|> filter hasChars
|> filter isTrimmed
|> filter isContinuous
|> convert ContinuousString string
这是一个旨在验证生成的测试:
[<Property(Arbitrary=[| typeof<ContinuousString> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
当我运行这个测试时,我得到:
System.Exception: No instances found on type Example.Generation+ContinuousString. Check that the type is public and has public static members with the right signature.
据我查看 FSCheck 源代码,我定义的成员应该可以通过发现过滤器找到,并且该方法似乎类似于类似的内置方法,例如 NonEmptyString
。
我错过了什么?谢谢!
您传递给 FsCheck 的类型有误。您应该将它传递给您的 Generators
class,而不是您的 ContinuousString
DU。即,这个:
[<Property(Arbitrary=[| typeof<ContinuousString> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
应该是:
[<Property(Arbitrary=[| typeof<Generators> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
FsCheck 错误消息也试图告诉您:
Check that the type is public and has public static members with the right signature.
您创建的与其查找相匹配的类型是 Generators
。
我正在编写一个 FSCheck 生成器来创建具有以下属性的字符串:
- 它们是非空的
- 修剪它们不会影响长度
- 它们不包含空格。
这是我的生成器代码:
namespace Example
open FsCheck.Arb
module public Generation =
let hasChars (s : string) =
(isNull s |> not)
&& s.Length > 0
let isTrimmed (s : string) =
s.Trim().Length = s.Length
let isContinuous (s : string) =
s
|> Seq.exists ((=) ' ')
|> not
[<AbstractClass; Sealed>]
type public Generators = class end
type public ContinuousString = ContinuousString of string with
member x.Get = match x with ContinuousString r -> r
override x.ToString() = x.Get
type public Generators with
static member ContinuousString() =
Default.String()
|> filter hasChars
|> filter isTrimmed
|> filter isContinuous
|> convert ContinuousString string
这是一个旨在验证生成的测试:
[<Property(Arbitrary=[| typeof<ContinuousString> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
当我运行这个测试时,我得到:
System.Exception: No instances found on type Example.Generation+ContinuousString. Check that the type is public and has public static members with the right signature.
据我查看 FSCheck 源代码,我定义的成员应该可以通过发现过滤器找到,并且该方法似乎类似于类似的内置方法,例如 NonEmptyString
。
我错过了什么?谢谢!
您传递给 FsCheck 的类型有误。您应该将它传递给您的 Generators
class,而不是您的 ContinuousString
DU。即,这个:
[<Property(Arbitrary=[| typeof<ContinuousString> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
应该是:
[<Property(Arbitrary=[| typeof<Generators> |], MaxTest=2)>]
let ``A continuous string contains no spaces`` (s: ContinuousString) =
s.Get.Contains " " |> not
FsCheck 错误消息也试图告诉您:
Check that the type is public and has public static members with the right signature.
您创建的与其查找相匹配的类型是 Generators
。