我正在使用Visual Studio 2010 Ultimate SP1。我的项目中有大约225个单元测试,它们都在通过。但是,其中一项测试报告了它所遇到的方法的0%代码覆盖率。在调试时,我可以单步执行并看到它命中方法的每一行。然而在代码覆盖率报告中,它表明该方法根本没有涉及。所有其他测试和方法在代码覆盖方面都可以正常工作。
我尝试过以下方法但没有成功:
如果重要,则该方法位于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 :(得分:0)
这可能是因为您使用了Moles - 当跑步者加载程序集时,Moles接管并配置程序集而不是coverage Profiler。
known integration issues有覆盖工具和鼹鼠 - 为了使两个.Net剖析器(Moles&amp; coverage)协同工作,他们必须相互实现特定的支持。
尝试在没有Moles的情况下运行,看看会发生什么......
另请参阅this作为类似示例。