我有一些带有单元测试的代码,这些代码在Debug版本中通过,但在正确的Release版本中失败。但是,使用JetBrains dotCover运行时,相同的测试会同时在调试和发布模式下通过。
给出一些背景知识,以下是令人讨厌的测试代码,只是为了让您了解为什么它无法发布版本-这主要是由于代码优化而减少了堆栈信息。
using System.Diagnostics;
using NUnit.Framework;
namespace DotCoverTest
{
[TestFixture]
public class TestLogger
{
[Test]
public void GetCurrentClassLoggerReturnsLoggerWithOwningTypeName()
{
Assert.AreEqual(Logger.GetCurrentClassLogger(), GetType().Name);
}
}
public class Logger
{
public static string GetCurrentClassLogger()
{
return new StackFrame(1, false).GetMethod().DeclaringType.Name;
}
}
}
编辑:
有什么想法可以设置构建,以便无论是否使用覆盖工具都可以得到相同的测试结果?
注意:此问题最初是发布的,认为这是TeamCity的问题,但不是。
最佳答案
我相信这里的主要问题是Tail call optimization,其中编译器折叠堆栈框架以提高性能。这仅在发布模式下发生。
dotCover(与其他.net探查器一样)禁用某些CLR优化,从而防止结果受损-如果方法执行不执行,将很难计数...
我不能告诉您NCover是否无法克服优化或以其他方式解决该问题,但是我非常确定dotCover。