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