我有一个似乎无法解开的谜团。我有这个非常简单的单元测试,它使用了一个非常简单的自定义属性。该属性仅添加到 1 个甚至没有实例化的类。我计算了构造属性的次数。由于 MyDummyClass 类的属性,我预计一次。但由于某种原因,unittest 结果为 2。如果我将它添加到类中两次,结果为 4。如果我将它添加到 MyTestClass,它会增加 6,如果我将它添加到 MyTest,则会再次增加 13。因此,在 MyDummyClass、MyTestClass 和 MyTest 上具有属性会导致计数为 21。为什么!?
我做了一些额外的测试:
- 如果我在控制台应用程序中尝试此操作,它会按预期工作并产生 1。
- 如果我在 MsTest 项目中执行此操作并使用 VS MsTest 运行器,结果为 1。
- 如果我运行NUnit 自己的查看器(2.0 框架)或 resharper 中的代码是 21。
- 值得注意:如果我使用 resharper 运行 MsTest 测试,结果是 2。似乎 resharper 也搞砸了。
我正在使用 VS2010 build 10.0.40219.1、Resharper v6.1.1000.82 和 NUnit 2.5.10(由 R# 提供)
关心测试它吗?继续,这是代码:
using System;
using NUnit.Framework;
namespace MyTests
{
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class WtfAttribute : Attribute
{
public static int CallCount = 0;
public WtfAttribute() //every time the attribute is constructed the count is incremented by 1.
{
CallCount++;
}
}
//this class is NEVER instantiated, but adding the attribute to it increases the callcount by 2. I expected it to be 1 due to reflection.
[Wtf]
public class MyDummyClass
{
}
[TestFixture]
//adding the attribute to MyTestClass increases the callcount by 6.
//[Wtf]
public class MyTestClass
{
[Test]
//adding the attribute to MyTest increases the callcount by 13.
//[Wtf]
public void MyTest()
{
Assert.AreEqual(1, WtfAttribute.CallCount, "CallCount = " + WtfAttribute.CallCount);
}
}
}
我希望任何人都可以帮助我弄清楚 WTF 是怎么回事。为什么呼叫计数不是 1?感谢您提供的任何帮助和评论。
问候,特德