2

Visual Studio 2010 Ultimate SP1 を使用しています。私のプロジェクトには約 225 個の単体テストがあり、それらはすべて合格しています。ただし、これらのテストの 1 つは、ヒットしたメソッドのコード カバレッジが 0% であると報告しています。デバッグ時には、ステップスルーして、メソッドのすべての行にヒットすることを確認できます。しかし、コード カバレッジ レポートでは、メソッドがまったくカバーされていないことが示されています。他のすべてのテストとメソッドは、コード カバレッジに関して問題なく機能します。

私は成功せずに次のことを試しました:

  • テスト中のメソッドを別のクラスに移動しました。
  • メソッドを作った
  • 静的対非静的。
  • テストを別のクラスに移動しました。
  • すべての .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);
            }
        }
    }
4

1 に答える 1

0

これはおそらく、Molesの使用が原因で発生します。ランナーがアセンブリをロードすると、Moles が引き継ぎ、カバレッジ プロファイラーの代わりにアセンブリをプロファイリングします。

カバレッジ ツールと Moles との統合に関する既知の問題があります。

ほくろなしで走ってみて、何が起こるか見てみましょう...

これも同様の例として参照してください。

于 2012-05-01T05:06:50.833 に答える