2009-08-23 54 views
6

我有以下設置:從類庫訪問App.Config中設置通過單元測試的項目稱爲

  • ASP.net 3.5網站項目
  • C#類庫與業務邏輯
  • C#類庫單元測試

業務邏輯庫執行所有數據庫訪問。它通過訪問System.Configuration.ConfigurationManager.ConnectionStrings從Web站點的web.config文件獲取連接字符串。當這個庫被網站調用時,這個工作正常,因爲庫查找調用者的配置。

我希望能夠通過單元測試類庫來測試我的業務邏輯。我已經在測試類庫的根目錄中放置了一個App.config文件。從我讀到的內容來看,當測試庫調用作爲業務邏輯庫一部分的數據訪問過程時,應該訪問和使用測試庫的App.config文件中的連接設置。但是,當我嘗試運行我的單元測試時,我收到錯誤,表示測試庫的App.config文件(和/或其內容)未被成功訪問。

我的配置屬性的檢索(從業務邏輯庫內)看起來是這樣的:

public SqlConnection MainConnection { 
    get { 
    string conn = ""; 
    try { 
     conn = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ConnectionString; 
    } catch { 
     // might be calling from test project. Need to reference app settings 
     conn = System.Configuration.ConfigurationManager.AppSettings["connString"]; 
    } 
    return new SqlConnection(conn); 
    } 
} 

當這是從網站項目調用時,它的工作原理。從單元測試中,conn變量永遠不會被設置爲任何東西(我也嘗試過使用System.Configuration.ConfigurationSettings.AppSettings,而不是使用相同的結果)。在NUnit GUI中調用時,如何使業務邏輯類庫成功檢索單元測試類庫設置,需要做些什麼?

+1

NUnit是您應該在您的問題中包含的重要信息,因爲我介紹了您描述的與Visual Studio的測試工具配合使用的場景。測試工具從測試項目中的app.conig讀取配置。 – 2009-08-23 12:30:24

+0

剛剛添加到我從NUnit GUI調用測試的問題中。 – 2009-08-23 12:44:02

+0

它應該像你所描述的那樣工作。您確定,您的測試項目的app.config中包含所有相關設置嗎?你可能會困惑AppSettings和ApplicationSettings?你能發佈兩個配置文件的相關部分嗎? – Manu 2009-08-23 12:51:48

回答

7

我只是找到了解決辦法here。通過NUnit GUI運行我的測試時,App.config現在正在被正確使用。

顯然,如果您使用的是NUnit GUI並通過Project> Add Assembly添加程序集,它不會訪問app.config。但是,如果您通過將DLL從Windows資源管理器拖到NUnit GUI中將該程序集添加到NUnit項目中,那麼它將訪問app.config。

或者,您可以通過GUI添加程序集,然後進入NUnit GUI> Project> Edit,並將配置文件名稱設置爲配置文件的名稱(VS會將其設置爲name.of.your .dll.config)並將Project Base設置爲項目的\ bin \ Debug目錄(這些是您在組件中拖動並手動添加它時在後臺完成的額外步驟)。

+1

鏈接現在已損壞。 – Doomsknight 2011-11-11 15:59:07

+1

活動鏈接:http://web.archive.org/web/20100619012049/http://www.safnet.com/writing/tech/archives/2007/12/nunit_ignores_a.html – 2012-02-10 20:48:15

+0

抱歉,但我試圖做到這一點的不工作,我有控制檯的應用程序,我只有exe文件沒有DLL – Chlebta 2014-05-28 00:14:12

0

嘗試WebConfigurationManager.OpenWebConfiguration()方法

Configuration config = WebConfigurationManager.OpenWebConfiguration(@"x:\path\web.config"); 
      KeyValueConfigurationCollection appSettings = config.AppSettings.Settings; 
      string connString = appSettings["connString"].Value; 
+1

剛剛嘗試過。 WebConfigurationManager.OpenWebConfiguration需要一個虛擬路徑 - 因爲我沒有從站點內調用它,所以我不能提供虛擬路徑。 – 2009-08-23 12:39:42

6

我會建議更改設計,使您的業務邏輯層,而不是有責任定位配置設置,與他們注入

您的Web應用程序可以注入從Web.config文件讀取的設置,而您的單元測試可以注入不同的設置(例如,連接字符串到測試數據庫等)

+0

我的情況是,我已經完成了相當多的工作後,將單元測試引入到項目中。爲了能夠進行單元測試,我將所有來自App_Code的代碼移到了它自己的獨立庫中。但在這一點上,依賴注入有點超出範圍。 – 2009-08-23 13:11:52

3

只需將app.config重命名爲name.of.your.dll.config即可。這個對我有用。

相關問題