【问题标题】:FsCheck.xUnit: testing types from another assemblyFsCheck.xUnit:测试来自另一个程序集的类型
【发布时间】:2016-01-17 22:11:31
【问题描述】:

我正在尝试使用 FsCheck 和 xUnit 进行我的第一次测试。我有以下设置:

  • 具有单个文件的 F# 类库

    namespace Lib
    type ABC = A | B | C
    
  • 一个名为 Tests 的项目引用了 FsCheck.xUnit NuGet 包和单个文件:

    module LibTests    
    open FsCheck.Xunit
    open Lib    
    [<Property>]
    let ``ABC is always A`` v =
      v = A
    

当我运行项目(使用 VS 或控制台运行程序)时,我收到以下错误:

System.Exception : The type Lib.ABC is not handled automatically by FsCheck. 
Consider using another type or writing and registering a generator for it

如果我将类型移动到 Tests 程序集,一切正常(测试失败)。如何测试外部类型?

【问题讨论】:

    标签: f# xunit fscheck


    【解决方案1】:

    这似乎与一个已知问题described on FsCheck GitHub有关。

    基本上,FsCheck NuGet 包依赖于旧版本的 FSharp.Core 库。旧版本被引用,导致测试代码与被测系统不兼容。

    解决问题:

    1. 安装 FsCheck NuGet 包后,转到测试项目引用并删除对旧版本 FSharp.Core(在我的情况下为 4.3.1.0)的引用。

    2. 单击“添加引用”以再次添加它,转到程序集 -> 扩展并添加与其他项目中使用的相同版本的 FSharpCore,在我的情况下为 4.4.0.0 .

    3. 将App.config 文件添加到您的测试项目中,内容如下:

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
              <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
              <bindingRedirect oldVersion="4.3.1.0" newVersion="4.4.0.0" />
            </dependentAssembly>
          </assemblyBinding>
        </runtime>
      </configuration>
      

    【讨论】:

    • App.config 中的绑定重定向正是我所需要的。请注意,您可以将其概括为&lt;bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0"&gt;
    【解决方案2】:

    首先,当我运行它时,我确实得到了不同的行为。我的测试项目的示例结果:

    结果消息:FsCheck.Xunit.PropertyFailedException:可证伪, 经过 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 版本。您可以在 extensions 下找到 FSharp.Core。

    您还可以使用 app.config 文件中的绑定重定向将对旧 FSharp.Core 版本的引用重定向到指定的较新版本。

    在您的 .fsproj 中使用 &lt;AutoGenerateBindingRedirects&gt;true&lt;/AutoGenerateBindingRedirects&gt; 可以自动生成此类绑定重定向。有关使用的更多详细信息,请参阅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。

    【讨论】:

    • 是的,我知道它应该可以工作,但它没有......如果你有时间,你可以克隆github.com/mikhailshilkov/FsCheckTest 并运行测试(我使用VS runner)。我在两台机器上遇到同样的错误。
    • @Mikhail 我还没有查看你的仓库,但我确实注意到(通过眼睛)你的 packages.config 中有一个 FSharp.Core。我想知道您的测试项目是否使用比您的主项目更旧的 FSharp.Core 版本。我建议您从您的 packages.config 中删除一个,删除对 FSharp.Core 的引用并从程序集列表中重新添加正确的版本。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2012-09-29
    相关资源
    最近更新 更多