私は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);
}
}
}
RELEASEでカバレッジを実行していますか?メソッド自体を表示できますか? – seldary
私はDEBUGで走っていました。しかし、あなたが尋ねた後、私はRELEASEでもう一度試してみましたが、結果は変わりませんでした。私はテストとテストされているメソッドの両方について、コードで質問を更新しました。私たちはMoqとMolesを使っています。 – jvaran