2016-09-27 73 views
5

我想设置一个非常简单的测试F#项目在Linux与单声道,使用Forge设置项目和安装nuget包。 Forge创建一个使用FAKE的build.fsx文件。我试图调整这个构建文件(为了添加测试)灵感来自本教程http://fsharp.github.io/FAKE/gettingstarted.html。但是,该教程使用C#进行测试,并假定Windows以.Net作为环境。我想使用F#进行测试,并使用mono作为环境。F#单元测试项目在Linux与单声道(FAKE,NUnit 3)

我想我几乎可以正常工作,但是我收到了一些来自NUnit的神秘错误消息。当运行build.fsx文件我会在月底以下错误:

... 
Invalid argument: -nologo 
The value '/home/michel/Documents/FSHARP/UnitTests/test/NUnit.Test.MyTests.dll' is not valid for option '--labels'. 
Invalid argument: -xml:./test/TestResults.xml 
Running build failed. 
Error: 
NUnit test failed (255). 

--------------------------------------------------------------------- 
Build Time Report 
--------------------------------------------------------------------- 
Target  Duration 
------  -------- 
Clean  00:00:00.0036366 
Build  00:00:00.0402828 
BuildTest 00:00:00.4911710 
Total:  00:00:00.7494956 
Status:  Failure 
--------------------------------------------------------------------- 
    1) Fake.UnitTestCommon+FailedTestsException: NUnit test failed (255). 
    at Fake.NUnitSequential.NUnit (Microsoft.FSharp.Core.FSharpFunc`2 setParams, IEnumerable`1 assemblies) <0x41d27e50 + 0x0039f> in <filename unknown>:0 
    at [email protected] (Microsoft.FSharp.Core.Unit _arg4) <0x41d27dc0 + 0x0006f> in <filename unknown>:0 
    at [email protected][a].Invoke (Microsoft.FSharp.Core.Unit unitVar0) <0x41cd59b0 + 0x00023> in <filename unknown>:0 
    at Fake.TargetHelper.runSingleTarget (Fake.TargetTemplate`1 target) <0x41ccb490 + 0x000ca> in <filename unknown>:0 

build.fsx文件看起来像这样

// include Fake libs 
#r "./packages/FAKE/tools/FakeLib.dll" 

open Fake 


// Directories 
let buildDir = "./build/" 
let testDir = "./test/" 

// version info 
let version = "0.1" // or retrieve from CI server 

// Targets 
Target "Clean" (fun _ -> 
    CleanDirs [buildDir; testDir] 
) 

Target "Build" (fun _ -> 
    //MSBuildDebug buildDir "Build" appReferences 
    !! "/UnitTesting/*.fsproj" 
    |> MSBuildRelease buildDir "Build" 
    |> Log "AppBuild-Output: " 
) 

Target "BuildTest" (fun _ -> 
        !! "src/NUnit.Test.MyTests/*.fsproj" 
        |> MSBuildDebug testDir "Build" 
        |> Log "TestBuild-Output: " 
) 

Target "Test" (fun _ -> 
       !! (testDir + "/NUnit.Test.MyTests.dll") 
       |> NUnit (fun p -> 
         { p with 
           ToolPath = "packages/NUnit.ConsoleRunner/tools" 
           //DisableShadowCopy = true; 
           OutputFile = testDir + "TestResults.xml" }) 
) 

Target "Default" (fun _ -> trace "HEEEELLOOOOOO world from FAKE!!!") 

"Clean" ==> "Build" ==> "BuildTest" ==> "Test" ==> "Default" 

RunTargetOrDefault "Default" 

FAKE似乎在寻找packages/NUnit.ConsoleRunner/tools目录下的文件nunit-console.exe,但有没有这样的文件。但是,有一个nunit3-console.exe文件,所以我只是用名称nunit-console.exe制作了此文件的副本。

我简单的测试文件NUnit.Test.MyTests.fs看起来像以下:

namespace NUnit.Test.MyTests 

module testmodule = 

    open NUnit.Framework 

    let SayHello name = "Hello" 

    [<TestFixture>] 
    type myFixture() = 

     [<Test>] 
     member self.myTest() = 
      Assert.AreEqual("Hello World!", SayHello "World") 

和文件test/NUnit.Test.MyTests.dll似乎产生就好了。

这个神秘的错误信息是什么意思,我该如何解决这个问题才能运行我的测试?

+4

FAKE具有'NUnit3'函数和'NUnit'函数。 NUnit在2到3之间有很大的变化,你不能只复制'nunit3-console.exe'并重新命名它,并期望事情能够发挥作用。尝试使用FAKE的'NUnit3'函数,你应该得到更好的结果。 – rmunn

回答

7

正如rmunn在评论中提到的,我需要使用函数NUnit3,因为我使用的是NUnit版本3.4.1。该功能位于FAKE.Testing模块http://fsharp.github.io/FAKE/apidocs/fake-testing-nunit3.html中。我修改了build.fsx文件,所以现在看起来如下:

// include Fake libs 
#r "./packages/FAKE/tools/FakeLib.dll" 

open Fake 
open Fake.Testing // NUnit3 is in here 


// Directories 
let buildDir = "./build/" 
let testDir = "./test/" 

// version info 
let version = "0.1" // or retrieve from CI server 
// Targets 
Target "Clean" (fun _ -> 
    CleanDirs [buildDir; testDir] 
) 

Target "Build" (fun _ -> 
    !! "/UnitTesting/*.fsproj" 
    |> MSBuildRelease buildDir "Build" 
    |> Log "AppBuild-Output: " 
) 

Target "BuildTest" (fun _ -> 
        !! "src/NUnit.Test.MyTests/*.fsproj" 
        |> MSBuildDebug testDir "Build" 
        |> Log "TestBuild-Output: " 
) 

Target "Test" (fun _ -> 
       !! (testDir + "/NUnit.Test.*.dll") 
       |> NUnit3 (fun p -> 
         { p with 
           ToolPath = "packages/NUnit.ConsoleRunner/tools/nunit3-console.exe" }) 
) 


Target "Default" (fun _ -> trace "HEEEELLOOOOOO world from FAKE!!!") 

"Clean" ==> "Build" ==> "BuildTest" ==> "Test" ==> "Default" 

RunTargetOrDefault "Default" 

注意它驻留,你必须指定ToolPath一路到nunit3-console.exe文件,而不仅仅是目录。

现在一切似乎都奏效了,当我运行build.fsx时,控制台输出中出现了一个很好且很简单的“测试总结”。 :)