我有一些带有单元测试的代码,这些代码在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。

10-05 21:46