最近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依存関係
と同じようにしたかったのです。SourceSource<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 つのバージョンが競合します。
しかし、それを証明する方法や修正する方法がわかりません。