2016-01-17 71 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