0

最近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 つのバージョンが競合します。

しかし、それを証明する方法や修正する方法がわかりません。

4

0 に答える 0