2016-03-26 11 views
4

F#プロジェクトのテストを書くのにFsUnit 2.1(NUnit 3.2)を使用しています。ここでは、単純なモジュールです:MissingMethodExceptionは、関数パラメータをとる関数をテストするとき

namespace Library1 
module LibraryFunctions = 
    let Execute f1 = f1() 
    let Id x = x 

そしてここでは、私のテストです:

namespace Tests 
open FsUnit 
open NUnit.Framework 
open Library1 

[<TestFixture>] 
type Tests() = 

    [<Test>] 
    // Passes 
    member x.``LibraryFunctions.Id should return the value``() = 
     LibraryFunctions.Id 42 |> should equal 42 

    [<Test>] 
    // Fails 
    member x.``LibraryFunctions.Execute should return the result of the function``() = 
     let f() = 42 
     LibraryFunctions.Execute f |> should equal 42 

第二の試験は、メッセージとともに(NCrunchとReSharperの中で)失敗:

System.MissingMethodException : Method not found: '!!0 Library1.LibraryFunctions.Execute(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,!!0>)'.

場合私は、テストが合格する別のVSプロジェクトではなく)テストと同じコードファイルにテスト対象のモジュールを配置します。私の疑問は、これはNUnitとF#/ C#interopの問題が原因だということです。もしそうなら、どのように解決できますか?

+1

両方のプロジェクトのF#(コア)バージョンを確認できますか? – CaringDev

+0

どちらのテストも私を通過しています。 FsUnit:2.1、NUnit:3.2、F#Core:3.1.2.5特定のバージョン:False。私はVS 2015を使用しています。 –

+0

@CaringDev 'Library1'はFSharp.Core 4.4.0.0を使用しています、' Tests'は特定バージョンで3.1.2.5を使用していますが、NCrunchとReSharperはありません。 :false。 – Blisco

答えて

5

これは、FsUnitと他のプロジェクトで既知の問題です(hereおよびhereを参照)。回避策として

、あなたのapp.configファイルにこれを追加することができます。

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

NB:それはあるときのように、あなたは、使用しているものは何でもFSharp.CoreあなたFsUnitアセンブリのバージョンにアップデート4.3.0.0が必要です更新しました。

関連する問題