VB.NETソースコードの「catchwithrethrow」ブロックで100%のコードカバレッジを達成できません。私の職場のIDEはVisualStudio 2010Ultimateです。以下の例は、私の実際の問題の簡略版を表しています。
C#のソース:(水色の背景は完全なコードカバレッジを示します)
VB.NETの同等のソース:(黄色の背景は部分的なコードカバレッジを示します)
C#とVB.NETソースの両方のMSTests(100%のコードカバレッジを達成することを目的としています)
コードカバレッジレポート
コードカバレッジレポートには、C#では100%が示されていますが、VB.NETでは91.67%しか示されていません。また、VB.NETでカバーされていない0行のコードの1ブロックも示しています。
これはツールの問題ですか?それとも私は明らかな何かを見逃していますか?
編集#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);
}
}
デバッグモードでVBプロジェクト用に生成されたILを見ると、catchブロックに次のように表示されます。
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
ので、実行されることのないコードがあります。
リリースモードでは、ClearProjectErrorのILは生成されません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加