我有一些单元测试的代码在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存在问题,但事实并非如此。
答案 0 :(得分:2)
我认为这里的主要问题是Tail call optimization,编译器会折叠堆栈帧以提高性能。这仅在发布模式下发生。
dotCover(与其他.net配置文件一样)禁用了一些CLR的优化,防止了泄露结果 - 如果方法执行不执行就很难计算...
我无法告诉你NCover是否未能克服优化,或以其他方式解决这个问题,但我对dotCover非常肯定。