Visual Studio 2010 UltimateのVB.NETで「catchwithrethrow」ブロックのコードカバレッジを100%取得するにはどうすればよいですか?

チャン

VB.NETソースコードの「catchwithrethrow」ブロックで100%のコードカバレッジを達成できません。私の職場のIDEはVisualStudio 2010Ultimateです。以下の例は、私の実際の問題の簡略版を表しています。

C#のソース:(水色の背景は完全なコードカバレッジを示します)

C#のソース


VB.NETの同等のソース:(黄色の背景は部分的なコードカバレッジを示します)

VB.NETのソース


C#とVB.NETソースの両方のMSTests(100%のコードカバレッジを達成することを目的としています)

MSTests


コードカバレッジレポート

コードカバレッジレポート


コードカバレッジレポートには、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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ