0

我最近在学习 F#。今天我写了一些代码并尝试添加单元测试。

我打算创建两个项目,一个是代码,另一个是测试。

因此,我创建了一个名为Visual Studio 2015 Community 中DataLab的项目的新解决方案。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

然后 VS 警告我open关于QueueTest.fs. 三者之一是:

未定义命名空间或模块“FsUnit”

所以我为项目添加了对Source项目的引用Test。我还FsUnit通过 NuGet 为Test项目安装。

我没有安装NUnit,因为它是FsUnit.

而且我没有FsUnitSource项目安装,因为Source不需要测试库。
我想让它类似于<scope>test</scope>Maven 中的 JUnit 依赖项。

我成功构建了整个解决方案。

当我在“测试资源管理器”中运行测试时(我还安装了“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>)'.

经过一些随机尝试,我也通过安装FsUnitSource项目成功地执行了测试。

我有一个关于这个问题的理论。

我安装了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#冲突。

但我不知道如何证明它或如何解决它。

4

0 回答 0