繁体   English   中英

F#的脚手架和FsUnit / FsCheck

[英]F#'s Scaffold and FsUnit/FsCheck

我正在努力使用ProjectScaffold在Linux上开始使用F#。 具体来说:我无法使项目与FsUnit / FsCheck / xunit一起使用。 我有F#3.1和mono 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等的引用。 因此,我假设我需要手动添加引用,因此tests / MyProject.Tests / paket.references现在是:

FsCheck
FsCheck.Xunit
FsUnit.xUnit
xunit

... build build.sh再次失败:找不到FsCheck。 我在包装文档中找不到如何添加本地依赖项(MyProject.Tests应该引用MyProject),它可能是自动完成的。

我遇到了这个问题,花了我一段时间才找到解决办法。 对于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>

问题在于,在mono上,软件包的路径中没有版本,但在Visual Studio中却有。 找到此修复程序后,我为测试创建了两个.fsproj文件,并修改了build.sh脚本以在通过mono时通过以下方式交换与mono兼容的文件:

#!/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和Mono下正常运行。

我不太确定,我了解您:您是否有两个fsproj文件,一个用于生产代码,一个用于单元测试? 并且您在fsproj中引用FsCheck吗?

另外,我还记得一个问题,如果您针对旧版本的.net进行编译并引用针对新版本的.net进行编译的程序集,则该程序集的行为就像没有引用一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM