我最近在学习 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
.
而且我没有FsUnit
为Source
项目安装,因为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>)'.
经过一些随机尝试,我也通过安装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#冲突。
但我不知道如何证明它或如何解决它。