为什么ClassCleanup属性需要在静态方法上?

时间:2013-10-01 04:28:34

标签: c# .net static mstest vs-unit-testing-framework

背景:我在.NET中有一堆单元测试,需要设置一些配置数据才能运行。最初,我使用TestInitializeTestCleanup来设置和拆除每个测试周围的配置数据;但是,对于整套测试,单个设置就足够了,所以我更愿意使用ClassInitializeClassCleanup

问题:当我将属性从TestInitialize更改为ClassInitialize并运行测试时,出现以下错误:

  

MyTestClass.ClassInit签名错误。该方法应标记为静态。

此属性背后的设计原因是什么,要求其方法是静态的?我的所有测试方法都是实例方法,所以我假设我的测试类至少有一个实例是在某处创建的,以便运行它们。为什么那个实例后来不负责清理呢?

我确实检查了MSDN,但他们没有明确提到静态要求,尽管他们确实有一个很好的例子。

1 个答案:

答案 0 :(得分:2)

MSDN声明ClassInitializeAttribute

  

标识一种方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配要由测试类使用的资源。这个类不能被继承。

我可以考虑这个问题的一个例子,就是当你的类中有一个静态字段时,实例的构造函数依赖于它。

class foo
{
  static someObject bar;
  int foobar;

  public foo()
  {
    this.foobar = foo.bar.SomeMethod()
  }
}

这种方式在您的ClassInitializeAttribute方法中,您可以为静态bar对象赋值,这将影响稍后创建的所有实例。

您可能希望使用ClassInitializeAttribute的另一种情况是分配测试可能使用的全局对象(例如mock数据库等)。