我试图在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它正在寻找 如何解决这个问题,因为我遇到了这个错误,如果有人可以帮我解决这个问题,那将会非常有帮助。
谢谢
答案 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
在失败之前打印出的错误消息(如果有)。