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

用户1968292

背景:我有一堆单元测试,.NET其中需要设置一些配置数据才能运行。最初,我使用TestInitializeTestCleanup来建立和拆除围绕每个测试的配置数据。但是,单个设置就足以完成整个测试套件,因此我宁愿使用ClassInitializeClassCleanup代替。

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

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

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

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

阿维·特纳(Avi Turner)

正如MSDN指出的ClassInitializeAttribute

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

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

class foo
{
  static someObject bar;
  int foobar;

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

这样,您ClassInitializeAttribute就可以方法中为静态bar对象分配一个值,这将影响以后创建的所有实例。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么需要在JAVA的void静态方法签名中声明泛型?

为什么要使用 ClassCleanup?

为什么扩展方法需要是静态的?

为什么我需要在此React方法上使用这些花括号

为什么我们需要在Linux上挂载?

为什么我需要在资源上使用.close()

为什么需要在实体类上放置@NamedQuery?

每当当前类是子类时,为什么要在方法或属性上使用密封

为什么委托方法需要在Swift中公开?

为什么一个变量需要在最终块静态

为什么非常数静态变量需要在类外部初始化?

为什么需要在Objective-C的头文件中使用“外部静态”来定义常量?

为什么得到“非静态字段,方法或属性'Photrax.App.DBPath.get'需要对象引用”?

为什么lambda翻译需要生成静态方法?

为什么我要在递归方法上添加行为?

什么时候以及为什么我们需要在bash上使用“ wait”命令?

为什么需要在结构中填充?

为什么需要在c#中使用所有属性而不是公共实例变量?

为什么我总是需要在Backbone中克隆模型属性?

为什么我需要在索引中使用下划线命名属性?

来自函数对象的静态方法。为什么我不需要静态方法呢?

需要在主线程上执行什么

杰克逊为什么我需要在子类上使用JsonTypeName批注

为什么需要在GCP上使用Centrify等安全解决方案?

为什么std :: map emplace需要在gcc上使用复制构造函数?

为什么Kafka docker需要在Unix套接字上侦听

为什么需要在Redshift上的COPY命令中引用IAM角色?

为什么在写入stderr之前需要在stdout上使用fflush?

为什么要在每个文件上都需要所有模块?