[英]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.