最近F#を勉強しています。今日、私はいくつかのコードを書き、単体テストを追加しようとしました。
コード用とテスト用の 2 つのプロジェクトを作成する予定でした。
そこで、Visual Studio 2015 CommunityDataLab
というプロジェクトで呼び出される新しいソリューションを作成しました。Source
次に、 という別のプロジェクトを追加しましたTest
。
構造は次のようになります。
Solution 'DataLab'
Source
Queue.fs
Test
QueueTest.fs
Queue.fs
は:
namespace DataLab
type Queue<'a> = Queue of 'a list * 'a list
module Queue =
let init<'a> : Queue<'a> = Queue ([], [])
QueueTest.fs
は:
namespace DataLab.Test
module QueueTest =
open DataLab
open FsUnit
open NUnit.Framework
[<Test>]
let ``test Init`` () =
let expected : Queue<int> = Queue ([], [])
Queue.init<int> |> should equal expected
open
その後、VS は のステートメントについて警告しましたQueueTest.fs
。3つのうちの1つは次のとおりです。
名前空間またはモジュール 'FsUnit' が定義されていません
Source
そのため、プロジェクトのプロジェクトへの参照を追加しましTest
た。プロジェクトFsUnit
用のNuGet経由でもインストールしました。Test
NUnit
に依存しているため、インストールしませんでしFsUnit
た。
また、ライブラリをテストする必要がないため、プロジェクトFsUnit
用にインストールしませんでした。MavenのJUnit依存関係
と同じようにしたかったのです。Source
Source
<scope>test</scope>
ソリューション全体を正常に構築しました。
「テスト エクスプローラー」でテストを実行すると (「NUnit3 テスト アダプター」拡張機能もインストールしました)、以下のエラーが発生しました。
System.MissingMethodException : Method not found: 'DataLab.Queue`1<!0> DataLab.Queue`1.NewQueue(Microsoft.FSharp.Collections.FSharpList`1<!0>, Microsoft.FSharp.Collections.FSharpList`1<!0>)'.
いくつかのランダムな試行の後、プロジェクトにもインストールFsUnit
することでテストが正常に実行されました。Source
私はこの問題について理論を持っています。
FsUnit 2.0.0
の依存関係を持つものをインストールしましたFSharp.Core (>= 3.1.2.5)
。私のプロジェクトFSharp.Core 3.1.2.5
にもインストールされています。そして、これは私のファイルをTest
汚染しました。Test.fsproj
以下の行がありますTest.fsproj
:
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFSharpCoreVersion>4.4.0.0</TargetFSharpCoreVersion>
<ItemGroup>
<Reference Include="FSharp.Core">
<HintPath>..\packages\FSharp.Core.3.1.2.5\lib\net40\FSharp.Core.dll</HintPath>
<Private>True</Private>
</Reference>
一方、Source
プロジェクトはまだ VS 2015 組み込み F# を使用しており、そのバージョンは 4.0+ です。したがって、F# の 2 つのバージョンが競合します。
しかし、それを証明する方法や修正する方法がわかりません。