我在静态类中有一个静态方法,在单元测试中失败。问题是它需要来自不同静态类的公共静态属性的值。单元测试中的属性值始终为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?
答案 0 :(得分:2)
在第一次使用该类的任何静态成员之前,首次访问时会初始化静态类 。单元测试代码也不例外。
要直接回答您的问题,可以在调用静态类B中的方法之前强制单元测试代码初始化静态类A - 为此,您只需要访问A类的任何公共静态成员: / p>
string appDir = App.AppDir;
但是,这可能不是您的代码的错误,因为您正在访问App.AppDir
(如果您接受我对您的问题的编辑,原来只有AppDir
)在B类中,应该正确地初始化它。
A类的变量appDir
在static 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
}
}