首先,当我运行它时,我确实得到了不同的行为。我的测试项目的示例结果:
结果消息:FsCheck.Xunit.PropertyFailedException:Falsifiable,经过 4 次测试(0 次收缩)(StdGen (196938613,296107830)):原始:B
这是有道理的,因为 fscheck 应该能够ABC
通过反射自动为可区分的联合类型(例如 )创建生成器,请参阅:https ://fscheck.github.io/FsCheck/TestData.html
因此,我建议检查您的所有软件包是否已正确安装且完全最新。
我安装了:
- FsCheck (v2.2.4)
- FsCheck.Xunit (v2.2.4)
- xunit (v2.1.0)
FSharp.Core
安装引用 FSharp.Core 的 nuget 包时请务必小心,因为它们通常随特定版本分发,会覆盖您的项目设置。
如果发生这种情况,请从您的 packages.config 文件中删除 FSharp.Core,删除项目中对 FSharp.Core 的引用,并将其替换为程序集列表中所需的 FSharp.Core 版本。您可以在扩展下找到 FSharp.Core。
您还可以使用 app.config 文件中的绑定重定向将对旧 FSharp.Core 版本的引用重定向到指定的较新版本。
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
在您的 .fsproj 中使用可以自动生成此类绑定重定向。有关使用的更多详细信息,请参阅https://fsharp.github.io/2015/04/18/fsharp-core-notes.html。
发电机
您收到的错误消息是指功能 fscheck,您可以在其中指定如何创建类型的任意实例以进行属性测试。自定义生成器的示例:
type MyGenerators =
static member ABC() =
{new Arbitrary<ABC>() with
override x.Generator = gen { return A; } // generator that creates only A
override x.Shrinker t = Seq.empty }
然后我可以使用这个生成器来检查我的财产:
[<Property(Arbitrary=[|typeof<MyGenerators>|])>]
static member ``ABC is always A`` v =
v = A
这个测试现在总是通过,因为我一直指定生成器创建一个A
.