gpt4 book ai didi

vb.net - 如何在 Visual Studio 2010 Ultimate 的 VB.NET 中获得 "catch with rethrow" block 的 100% 代码覆盖率?

转载 作者:行者123 更新时间:2023-12-04 15:21:54 26 4
gpt4 key购买 nike

我无法在我的 VB.NET 源代码中为“重新抛出捕获” block 实现 100% 的代码覆盖率。我的工作场所 IDE 是 Visual Studio 2010 Ultimate。下面的示例代表了我的实际问题的简化版本。

C# 中的源代码:(浅蓝色背景表示完整的代码覆盖)

Source in C#

VB.NET 中的等效源代码:(黄色背景表示部分代码覆盖)

Source in VB.NET

C# 和 VB.NET 源代码的 MSTests(旨在实现 100% 的代码覆盖率)

MSTests

代码覆盖率报告

Code Coverage Report

代码覆盖率报告显示 C# 为 100%,但 VB.NET 仅为 91.67%。它还显示了 1 个代码块,其中 0 行在 VB.NET 中被发现。

这是工具的问题吗?还是我错过了一些明显的东西?

编辑#1:根据@Raptor 的要求共享源代码

C#源代码

public class CodeCoverage
{
public void DoWork(bool flag = false)
{
try
{
Thread.Sleep(1);

if (flag)
{
throw new Exception("test");
}
}
catch (Exception ex)
{
throw new Exception(string.Format("something happened: {0}", ex.Message));
}
}
}

VB.NET中的源代码
Public Class CodeCoverage2
Public Sub DoWork(Optional ByVal flag As Boolean = False)
Try
Thread.Sleep(1)

If flag Then
Throw New Exception("test")
End If
Catch ex As Exception
Throw New Exception(String.Format("something happened: {0}", ex.Message))
End Try
End Sub
End Class

MSTests 的源代码
[TestClass]
public class CodeCoverageTest
{
[TestMethod]
public void DoWorkTest()
{
var obj = new CodeCoverage();
obj.DoWork();
}

[TestMethod]
[ExpectedException(typeof(Exception))]
public void DoWorkTest2()
{
var obj = new CodeCoverage();
obj.DoWork(true);
}

[TestMethod]
public void DoWorkTest3()
{
var obj = new CodeCoverage2();
obj.DoWork();
}

[TestMethod]
[ExpectedException(typeof(Exception))]
public void DoWorkTest4()
{
var obj = new CodeCoverage2();
obj.DoWork(true);
}
}

最佳答案

如果您在 Debug模式下查看为 VB 项目生成的 IL,您将在 catch block 中看到以下内容:

IL_002f: call string [mscorlib]System.String::Format(string, object)
IL_0034: newobj instance void [mscorlib]System.Exception::.ctor(string)
IL_0039: throw

IL_003a: call void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.ProjectData::ClearProjectError()
IL_003f: leave.s IL_0041

由于 IL_0039抛出,你永远不会击中 IL_003a ,所以你有永远不会被执行的代码。

在 Release模式下,不会生成 ClearProjectError 的 IL。

关于vb.net - 如何在 Visual Studio 2010 Ultimate 的 VB.NET 中获得 "catch with rethrow" block 的 100% 代码覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27774127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com