Dot-Net
在單元測試中修改應用程序設置
我有一個類庫,我想使用 Microsoft 的單元測試框架進行單元測試。我想測試的一些類是使用應用程序設置配置的。這些設置在
Settings.settings文件中定義,具有應用範圍和合適的預設值。當應用程序使用該庫時,可以在App.Config文件中覆蓋這些設置。如果不是,則使用預設值。這正是我想要的樣子。在我的一些測試案例中,我想測試設置值的特殊組合,但我不知道如何從單元測試程式碼中更改被測類看到的值。這些設置將始終從程式碼生成類的屬性中載入其預設值。
在我的庫類中,我訪問如下設置:
var mySetting1 = Settings.Default.MySetting1; var mySetting2 = Settings.Default.MySetting2;在被測試的類訪問設置之前,如何在單元測試中修改這些設置?使單元測試可以訪問內部設置類並不能解決問題,因為設置具有應用範圍並且是設置類的只讀屬性。
在深入研究
ApplicationSettingsBase相關類之後,我想出了解決我問題的方法。不是特別漂亮,但它確實可以完成工作。程式碼生成的設置類是類庫項目內部的,它必須可供單元測試項目訪問。將
[assembly: InternalsVisibleTo("UnitTestAssemblyName")]屬性添加到AssemblyInfo.cs類庫項目中。當訪問一個值時,這些設置是從設置類的屬性中延遲載入的。第一步是對設置進行“虛擬”讀取以強制執行此延遲載入。在進行單元測試時,您希望避免在一個測試中更改設置值以影響另一個測試,因此有必要在延遲載入之前“重置”設置。這可以使用該
Reload()方法來完成。這段程式碼放在測試初始化方法中:Settings.Default.Reload(); var dummy = Settings.Default.MySetting1;基礎值現在存在並且可以在每個測試方法中設置。請記住使用正確的類型,因為程式碼生成的 getter 會進行強制轉換:
Settings.Default.PropertyValues["MyStringSetting1"].PropertyValue = "Foobar"; Settings.Default.PropertyValues["MyDoubleSetting2"].PropertyValue = 3.1416D;