2016-01-17 69 views
2

测试类型,我试图让我的FsCheck和xUnit的第一次测试。我有以下设置:FsCheck.xUnit:从另一个组件

  • 的F#类库与一个单一的文件

    namespace Lib 
    type ABC = A | B | C 
    
  • 一个项目叫做测试与参考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 

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

回答

4

它似乎与已知问题described on FsCheck GitHub有关。

基本上,FsCheck NuGet包依赖于旧版本的FSharp.Core库。旧版本被引用,这使得测试代码与被测系统不兼容。安装后FsCheck NuGet包,去测试项目引用和删除(在我的情况4.3.1.0)引用了老版FSharp.Core的

  1. 要解决的问题。

  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> 
    
+0

App.config中的绑定重定向正是我所需要的。请注意,您可以将其推广到'''' –

3

首先,当我运行它,我得到不同的行为给你。一个例子,从我的测试项目结果:

Result Message: FsCheck.Xunit.PropertyFailedException : Falsifiable, after 4 tests (0 shrinks) (StdGen (196938613,296107830)): Original: 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因为他们AR的NuGet包时要小心e经常分发一个覆盖项目设置的特定版本。

如果发生这种情况,请从packages.config文件中删除FSharp.Core,删除项目中对FSharp.Core的引用,并将其替换为程序集列表中所需的FSharp.Core版本。您可以在扩展名下找到FSharp.Core。

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

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

+0

是的,我知道,它应该工作,但它不...如果你有时间,能你克隆https://github.com/mikhailshilkov/FsCheckTest并运行测试(我使用VS亚军)。两台机器上出现同样的错误。 – Mikhail

+0

@Mikhail我还没有签出你的回购协议,但我注意到(眼睛)你的packages.config中有一个FSharp.Core。我想知道你的测试项目是否使用比你的主项目更早的FSharp.Core版本。我建议您从packages.config中删除一个,删除对FSharp.Core的引用并从程序集列表中重新添加正确的版本。 – TheInnerLight

+0

现在问题解决了,谢谢您的观察! – Mikhail