为什么 ClassCleanup 属性需要位于静态方法上
本文关键字:静态方法 ClassCleanup 属性 为什么 | 更新日期: 2023-09-27 18:33:20
背景:我在.NET
中有一堆单元测试,需要设置一些配置数据才能运行。最初,我使用 TestInitialize
和 TestCleanup
来设置和拆卸每个测试的配置数据;但是,单个设置足以满足整套测试,因此我更愿意使用 ClassInitialize
和 ClassCleanup
代替。
问题:当我将属性从TestInitialize
更改为ClassInitialize
并运行测试时,出现以下错误:
MyTestClass.ClassInit 有错误的签名。 该方法应标记为静态。
此属性要求其方法为静态背后的设计原因是什么?我所有的测试方法都是实例方法,所以我假设至少在某处创建了一个测试类的实例来运行它们。为什么那个实例不负责事后清理?
我确实检查了MSDN,他们没有明确提到静态要求,尽管他们确实有一个很好的用法示例。
正如MSDN所述 ClassInitializeAttribute
标识一个方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配测试类要使用的资源。此类不能继承。
我可以考虑的一个例子是,当你的类中有一个实例的构造函数所依赖的静态字段时。
class foo
{
static someObject bar;
int foobar;
public foo()
{
this.foobar = foo.bar.SomeMethod()
}
}
这样,在 ClassInitializeAttribute
方法中,您可以为静态 bar
对象赋值,这将影响稍后创建的所有实例。
您可能希望使用该ClassInitializeAttribute
的另一种情况是分配测试可能使用的全局对象(例如模拟数据库等(。