[英]Unit Test Fails due to uninitialized static property
我在静态类中有一个静态方法,该方法在单元测试下失败。 问题在于它需要来自其他静态类的公共静态属性的值。 单元测试中的属性值始终为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?
静态类在首次使用该类的任何静态成员之前进行首次访问时进行初始化。 单元测试代码也不例外。
为了直接回答您的问题,可以在调用静态类B中的方法之前强制单元测试代码初始化静态类A-为此,您只需要访问类A的任何公共静态成员:
string appDir = App.AppDir;
但是,这可能不是代码的问题,因为您正在访问类B中的App.AppDir
(如果您接受了对问题的编辑,最初只是对AppDir
),则应正确初始化它。
您的类A的变量appDir
是在static void Main()
初始化的,该变量不会在单元测试中运行。 您应该改为添加静态构造函数:
static App()
{
appDir = AppDomain.CurrentDomain.BaseDirectory;
}
只需更改您的类App
即可绕过静态字段,然后将目录放入静态属性getter中。 很有可能尚未设置字段appDir
,因为在idbCn
上的静态字段初始化程序之前未调用Main()
。
static class App {
public static string AppDir => AppDomain.CurrentDomain.BaseDirectory;
[STAThread]
static void Main() {
DbEng.PutIdbVal("x", "Y"); // Method under test - Works here
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.