Dot-Net

在單元測試中修改應用程序設置

  • February 18, 2016

我有一個類庫,我想使用 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;

引用自:https://stackoverflow.com/questions/3719107