我正在努力在使用ProjectScaffold的Linux上开始使用F#。 具体来说:我无法让一个项目与FsUnit / FsCheck / xunit一起使用。一世 有F#3.1和单声道3.12.1,我在Linux(Ubuntu)x64。
我用:
启动“MyProject”$ git clone --depth=1 git@github.com:fsprojects/ProjectScaffold.git
$ cd ProjectScaffold && ./build.sh
然后我在“src / MyProject / Library.fs”中添加了一些代码:
module MyProject.X
let four = 4
然后两个测试“tests / MyProject.Tests / Tests.fs”:
module MyProject.Tests.X
open Xunit
open FsUnit.Xunit
open FsCheck
open FsCheck.Xunit
open MyProject.X
[<Fact>]
let ``Two plus two is four.`` () =
2 + 2 |> should equal four
[<Property>]
let ``Sorting a sorted list is idempotent.`` (l: int list) =
let s = List.sort l
s = List.sort s
此代码适用于Visual Studio,我手动添加了FsCheck,FsUnit,anx xunit 1.9.2(以后的版本失败了 由于某些原因)。我在Windows / Visual Studio上的测试项目有这个配置文件:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FsCheck" version="1.0.4" targetFramework="net45" />
<package id="FsCheck.Xunit" version="1.0.4" targetFramework="net45" />
<package id="FsUnit.xUnit" version="1.3.0.1" targetFramework="net45" />
<package id="xunit" version="1.9.2" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net45" />
</packages>
所以我编辑paket.dependencies来添加这些包并删除Nunit:
source https://nuget.org/api/v2
nuget FSharp.Formatting 2.8.0
nuget FSharpVSPowerTools.Core 1.7.0
nuget FAKE
nuget FsCheck 1.0.4
nuget FsCheck.Xunit 1.0.4
nuget FsUnit.xUnit 1.3.0.1
nuget xunit 1.9.2
nuget SourceLink.Fake
github fsharp/FAKE modules/Octokit/Octokit.fsx
然后:
$ mono .paket/paket.exe install
...并且因为NUnit被引用到某处而失败了,所以我删除了tests / MyProject.Tests / paket.references和
中的引用$ mono .paket/paket.exe install
有效,但
$ ./build.sh
失败,因为它无法找到对FsCheck等人的引用。所以我假设我需要手动添加引用,所以现在test / MyProject.Tests / paket.references:
FsCheck
FsCheck.Xunit
FsUnit.xUnit
xunit
... build build.sh再次失败:找不到FsCheck。我在paket doc中找不到如何添加本地依赖项(MyProject.Tests应该引用MyProject),它可能会自动完成。
答案 0 :(得分:1)
我遇到了这个问题,我需要一段时间来找出解决方法。对于Tests目录中的项目文件,我不得不改变它:
<Reference Include="FsUnit.NUnit">
<HintPath>..\..\packages\FsUnit.1.3.0.1\Lib\Net40\FsUnit.NUnit.dll</HintPath>
<Private>True</Private>
</Reference>
对此:
<Reference Include="FsUnit.NUnit">
<HintPath>..\..\packages\FsUnit\Lib\Net40\FsUnit.NUnit.dll</HintPath>
<Private>True</Private>
</Reference>
同样,对于NUnit:
<Reference Include="nunit.framework">
<HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference>
要:
<Reference Include="nunit.framework">
<HintPath>..\..\packages\NUnit\lib\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference>
问题是在单声道上,包在路径中没有版本,但在Visual Studio中它们没有。一旦我找到了这个修复,我为测试创建了两个.fsproj文件,我修改了build.sh脚本,以便在mono via下交换单声道兼容的文件:
#!/bin/bash
if test "$OS" = "Windows_NT"
then
# no changes in here
else
# fix test fsproj file
mv tests/ProjectName.Tests/ProjectName.Tests.fsproj tests/ProjectName.Tests/ProjectName.Tests.fsproj.vs
mv tests/ProjectName.Tests/ProjectName.Tests.fsproj.mono tests/ProjectName.Tests/ProjectName.Tests.fsproj
# leave the script logic for mono in place
# put project files back to avoid git noticing the swap
mv tests/ProjectName.Tests/ProjectName.Tests.fsproj tests/ProjectName.Tests/ProjectName.Tests.fsproj.mono
mv tests/ProjectName.Tests/ProjectName.Tests.fsproj.vs tests/ProjectName.Tests/ProjectName.Tests.fsproj
fi
一旦我做了这些更改,项目在Visual Studio和单声道下都能正常工作。
答案 1 :(得分:0)
我不太确定,我理解你:你有两个fsproj文件,一个用于生产代码,一个用于单元测试?你在fsproj中引用了FsCheck吗?
另外,我记得一个问题,如果您针对较旧版本的.net进行编译并引用针对较新版本的.net编译的程序集,则其行为就好像没有引用一样。