UnitTesting静态类

SNA*_*SNA 20 .net c# unit-testing

场景.语言C#,使用VS2008单元测试框架进行单元测试

我有一个带静态构造函数的静态类和2个方法.我编写了4种测试方法来测试整个类.我的静态构造函数有一些重要的初始化.

现在,如果我串联运行所有4个单元测试用例,则只在开始时调用静态构造函数.在每个测试用例结束时,没有这样的事情

称为静态析构函数,因此构造函数中的状态信息也会被传递到下一个单元测试用例.解决方法是什么?

rob*_*rob 40

Type staticType = typeof(StaticClassName);
ConstructorInfo ci = staticType.TypeInitializer;
object[] parameters = new object[0];
ci.Invoke(null, parameters);
Run Code Online (Sandbox Code Playgroud)

来自http://colinmackay.scot/2007/06/16/unit-testing-a-static-class/

  • 嘿看,问题的实际答案,而不是"不要那样做". (23认同)
  • 如果您有任何静态字段已声明但未在其声明中分配值,则此方法无效.例如`static class API {static int timeout = 5000,static string lastError; 以这种方式调用静态构造函数将重置`timeout`,但`lastError`将保持上次测试时的状态.我找到的唯一解决方法是编辑类来初始化所有字段,如`static string lastError = null`. (2认同)

And*_*erd 12

最简单的解决方案是向静态类添加"重置"方法,该方法具有破坏它并重构它的等效行为.

您可能有充分的理由在这里使用静态类.但是,由于静力学不能很好地与单元测试相结合,我通常会寻找替代设计.


Ben*_*tBe 7

我会将初始化从静态构造函数移动到构造函数调用的方法.通过将此方法设置为内部,您可以从测试中调用此方法以重新初始化该类.

public static class MyClass
{
   public static MyClass()
   {
      initialize();
   }

   internal static void initialize()
   {
      // Do initialization (and cleanup if necessary)
   }

   public static void Method1() {}
   public static void Method2() {}
}
Run Code Online (Sandbox Code Playgroud)

要调用内部方法,您需要使用InternalsVisibleTo属性,如本博客中所述.

您也可以将其设为私有,但之后您需要使用反射来调用它.

但正如Andrew Shepherd所说,你还应该检查静态类是否是这个类的最佳设计.