2012-04-26 9 views
2

私はVisual Studio 2010 Ultimate SP1を使用しています。私は私のプロジェクトで約225台のユニットテストをしており、すべてが合格しています。しかし、それらのテストの1つは、ヒットしたメソッドのコードカバレッジが0%であると報告します。デバッグするときに、私は一歩一歩進んで、メソッドのすべての行にヒットすることを確認できます。しかし、コードカバレッジレポートでは、この方法がまったく対象外であることが示されています。他のすべてのテストとメソッドは、コードカバレッジに関してうまく機能します。VS2010コードカバレッジが正確でない

ノー成功を収めて次のことを試してみた:

  • は別のクラスにテストされている方法を動かしました。
  • メソッドを作成しました
  • 静的対非静的です。
  • テストを別のクラスに移動しました。
  • は私.testsettingのすべてのファイルを削除し、最初からそれらを再作成
  • はVS
  • 再起動同じ結果で、同じ方法を行使するためにさまざまなテストを書いた場合

を再起動して問題は、メソッドがGlobal.asaxファイルにありました。しかし、私はそれを別のクラスに移しましたが、違いはありませんでした。

アイデア?

ここでは、テストされているメソッドです。

public void LogError(ILoggingService loggingService, IController controller) 
    { 
     if (loggingService == null) 
      throw new ArgumentNullException("loggingService"); 

     if (controller == null) 
      throw new ArgumentNullException("controller"); 

     Exception ex = Server.GetLastError(); 

     loggingService.LogException(ex.Message, ex.StackTrace, ApplicationName.VoucherLog, UserInfo.UserName); 


     HttpException httpException = ex as HttpException; 

     if (httpException == null) 
     { 
      var routeData = new RouteData(); 
      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "HttpError"; 

      Server.ClearError(); 

      var rc = new RequestContext(new HttpContextWrapper(Context), routeData); 
      controller.Execute(rc); 
     } 
    } 

例外がスローされる最初の4行は、他のテストでヒットし、コードカバレッジ統計に表示されます。メソッドの残りの部分は、次のテスト(実際に実行されている各行が実際に実行されていることを確認してデバッグすることで確認されます)にヒットしますが、コードカバレッジ統計には表示されません。 - ランナーアセンブリをロードとして、モグラが引き継ぎ、アセンブリの代わりに、カバレッジプロファイラプロファイル

[TestMethod] 
    [HostType("Moles")] 
    public void LogError() 
    { 
     DMVCommon.ApplicationName expectedApplication = DMVCommon.ApplicationName.VoucherLog; 
     string expectedUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
     NotImplementedException expectedException = null; 

     System.Web.Moles.MHttpServerUtility.AllInstances.GetLastError = (System.Web.HttpServerUtility server) => 
     { 
      return expectedException; 
     }; 

     System.Web.Moles.MHttpApplication.AllInstances.ContextGet = (System.Web.HttpApplication application) => 
     { 
      return MvcMockHelpers.FakeHttpCurrentContext(); 
     }; 


     try 
     { 
      throw new NotImplementedException(); 
     } 
     catch (NotImplementedException exc) 
     { 
      expectedException = exc; 
      using (MvcApplication app = new MvcApplication()) 
      { 
       bool called = false; 

       Mock<ILoggingService> mockLoggingService = new Mock<ILoggingService>(); 
       mockLoggingService.Setup(a => a.LogException(expectedException.Message, expectedException.StackTrace, expectedApplication, expectedUser)).Callback(() => called = true); 

       Mock<IController> mockController = new Mock<IController>(); 

       app.LogError(mockLoggingService.Object, mockController.Object); 

       mockController.Verify(a => a.Execute(It.IsAny<System.Web.Routing.RequestContext>()), Times.Exactly(1)); 
       Assert.IsTrue(called); 
      } 
     } 
    } 
+0

RELEASEでカバレッジを実行していますか?メソッド自体を表示できますか? – seldary

+0

私はDEBUGで走っていました。しかし、あなたが尋ねた後、私はRELEASEでもう一度試してみましたが、結果は変わりませんでした。私はテストとテストされているメソッドの両方について、コードで質問を更新しました。私たちはMoqとMolesを使っています。 – jvaran

答えて

0

これが原因Molesの使用状況のおそらく起こる:ここではテストです。彼らはお互いのために特定のサポートを実装する必要が一緒に動作するために、2つの.Netプロファイラ(ほくろ&カバレッジ)ためには -

カバレッジ・ツールとモルとknown integration issuesがありました。

も同様の例としてthisを参照してください...モグラなしで実行すると何が起こるかを見るために

を試してみてください。

+0

はい、それでした!私がモルドされていた行とテストのモルをコメントアウトすると、それはすべて期待どおりに機能しました。だから私は今、私の最善の行動コースは、実際にカバーされている理由を説明するコメントと共に、[ExcludeFromCodeCoverage]属性をメソッドに追加することだけです。私の唯一の懸念は、カバレッジを変更する可能性のある将来のコード変更が必ずしも気づかれるということではありません。 – jvaran

関連する問題