为什么 ClassCleanup 属性需要位于静态方法上

本文关键字:静态方法 ClassCleanup 属性 为什么 | 更新日期: 2023-09-27 18:33:20

背景:我在.NET中有一堆单元测试,需要设置一些配置数据才能运行。最初,我使用 TestInitializeTestCleanup 来设置和拆卸每个测试的配置数据;但是,单个设置足以满足整套测试,因此我更愿意使用 ClassInitializeClassCleanup 代替。

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

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

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

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

为什么 ClassCleanup 属性需要位于静态方法上

正如MSDN所述 ClassInitializeAttribute

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

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

class foo
{
  static someObject bar;
  int foobar;
  public foo()
  {
    this.foobar = foo.bar.SomeMethod()
  }
}

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

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