由于未初始化的静态属性,单元测试失败

时间:2016-05-31 01:05:46

标签: c# visual-studio unit-testing

我在静态类中有一个静态方法,在单元测试中失败。问题是它需要来自不同静态类的公共静态属性的值。单元测试中的属性值始终为null,因为源类未初始化。两个静态类都在同一个项目中。如果我直接执行该方法,我会得到所需的结果,但我无法使用测试。

静态A类:

static class App {

  private static string appDir;

  public static string AppDir => appDir;

  [STAThread]
  static void Main() {

    appDir = AppDomain.CurrentDomain.BaseDirectory;

    DbEng.PutIdbVal("x", "Y");  // Method under test - Works here

  }
}

静态B类:

public static class DbEng {

  private static SQLiteConnection idbCn = new SQLiteConnection("Data Source=" + App.AppDir + "gcg.idb"); // App.AppDir is valid when not testing, is null when testing.

  public static void PutIdbVal(string key, string value) {

  using (var cmd = new SQLiteCommand("INSERT INTO tKv (Key, Value) VALUES (@key, @value)", idbCn)) {
      cmd.Parameters.Add(new SQLiteParameter("@key", key));
      cmd.Parameters.Add(new SQLiteParameter("@value", value));
      idbCn.Open();
      cmd.ExecuteNonQuery();
      idbCn.Close();
    }
  }
}

单元测试:

[TestClass]
public class DbEng_Tests {
  [TestMethod]
  public void PutIdbVal_Test() {

    string TestKey = "Test-Key";
    string TestValue = "Test - Value";

    DbEng.PutIdbVal(TestKey, TestValue);

  }
}

在调用静态类B中的方法之前,是否可以强制单元测试代码初始化静态类A?

2 个答案:

答案 0 :(得分:2)

在第一次使用该类的任何静态成员之前,首次访问时会初始化静态类 。单元测试代码也不例外。

要直接回答您的问题,可以在调用静态类B中的方法之前强制单元测试代码初始化静态类A - 为此,您只需要访问A类的任何公共静态成员: / p>

string appDir = App.AppDir;

但是,这可能不是您的代码的错误,因为您正在访问App.AppDir(如果您接受我对您的问题的编辑,原来只有AppDir )在B类中,应该正确地初始化它。

A类的变量appDirstatic void Main()中初始化,不会在单元测试中运行。您应该添加一个静态构造函数:

static App()
{
     appDir = AppDomain.CurrentDomain.BaseDirectory;
}

答案 1 :(得分:1)

只需更改您的类App以绕过静态字段并将目录放在静态属性getter中。字段appDir很可能尚未设置,因为在调用Main()上的静态字段初始值设定项之前未调用idbCn

static class App {

  public static string AppDir => AppDomain.CurrentDomain.BaseDirectory;

  [STAThread]
  static void Main() {

    DbEng.PutIdbVal("x", "Y");  // Method under test - Works here

  }
}