使用dotCover进行代码覆盖会引发错误 - FAKE F#MAKE

时间:2017-03-24 11:28:50

标签: f# f#-interactive f#-3.0 f#-data f#-fake

我试图在FAKE中使用DotCover,但是它会引发一些错误,因为我是FAKE和F#的新手,我很难理解问题的根本原因。这是代码:

 #r "D:/FAKEProject/Fake/packages/FAKE/tools/FakeLib.dll"
    open Fake
    open Fake.DotCover
    let testDir = "D:/FAKEProject/Fake/test/"
    let filters = ""
    Target "Clean" (fun _ ->
        CleanDirs [testDir]
    )
    Target "TestCoverage" (fun _ ->
        !! ("D:/FAKEProject/Fake/UnitTest/UnitTest.dll")
            |> DotCoverNUnit
                (fun p -> { p with Output = testDir @@ "NUnitDotCover.snapshot"
                                   ToolPath = "D:/tools/dotCover/dotCover.exe"
                                   Filters = filters })                              
                (fun nunitOptions -> nunitOptions)
    )
    "Clean"
        ==> "TestCoverage"
    RunTargetOrDefault "TestCoverage"`

提供此错误

System.Exception: Error running D:/tools/dotCover/dotCover.exe with exitcode -1
   at Fake.DotCover.buildParamsAndExecute@124-6.Invoke(String message) in C:\code\fake\src\app\FakeLib\DotCover.fs:line 124
   at Fake.DotCover.buildParamsAndExecute[a](a parameters, FSharpFunc`2 buildArguments, String toolPath, String workingDir, Boolean failBuild) in C:\code\fake\src\app\FakeLib\DotCover.fs:line 124
   at Fake.DotCover.DotCoverNUnit(FSharpFunc`2 setDotCoverParams, FSharpFunc`2 setNUnitParams, IEnumerable`1 assemblies) in C:\code\fake\src\app\FakeLib\DotCover.fs:line 190
   at FSI_0005.DotCover.clo@16-2.Invoke(Unit _arg2) in D:\FAKEProject\Fake\DotCover.fsx:line 17
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\fake\src\app\FakeLib\TargetHelper.fs:line 492`

我无法理解为什么它在C:\ code \ fake \ src \ app \ fakelib \ dotcover.fs中搜索 什么是dotcover.fs它正在寻找 如何解决这个问题,因为我遇到了这个错误,如果有人可以帮我解决这个问题,那将会非常有帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

神秘的C:\code\fake\src\app\FakeLib\DotCover.fs行只是告诉你抛出错误的源文件的文件名(和行号)。不是 系统上的文件名,而是构建FAKE.exe文件的系统上的文件名。换句话说,它只是告诉你抛出异常的位置。

查看FAKE源代码,我看到第124行接近下一段代码的结尾:

let buildParamsAndExecute parameters buildArguments toolPath workingDir failBuild =
    let args = buildArguments parameters
    trace (toolPath + " " + args)
    let result = ExecProcess (fun info ->  
              info.FileName <- toolPath
              info.WorkingDirectory <- getWorkingDir workingDir
              info.Arguments <- args) TimeSpan.MaxValue
    let ExitCodeForFailedTests = -3
    if (result = ExitCodeForFailedTests && not failBuild) then 
        trace (sprintf "DotCover %s exited with errorcode %d" toolPath result)
    else if (result = ExitCodeForFailedTests && failBuild) then 
        failwithf "Failing tests, use ErrorLevel.DontFailBuild to ignore failing tests. Exited %s with errorcode %d" toolPath result
    else if (result <> 0) then 
        failwithf "Error running %s with exitcode %d" toolPath result
    else 
        trace (sprintf "DotCover exited successfully")

failwithf函数是F#相当于“抛出新异常()”,但它允许您指定一条消息(使用printfn - 样式格式代码,如%s)例外。所以F#中没有什么神秘的东西,只是你的D:/tools/dotCover/dotCover.exe程序返回了-1返回代码。返回代码-1通常意味着“一般错误”,因此在找出原因方面没有多大帮助。

您的下一个故障排除步骤是手动运行dotCover.exe程序,为其提供与FAKE提供的相同的参数(不应该太难以理解,因为FAKE选项记录通常很好 - 命名)和相同的输入。然后查看dotCover.exe在失败之前打印出的错误消息(如果有)。