問題描述:
對一個需要讀取web.config獲取數據庫連接字符串的項目創建單元測試,測試拋出異常:System.NullReferenceException: 未將對象引用設置到對象的實例,一步步debug發現在測試項目中無法讀取被測項目的web.config文件。后來把web.config整個復制到測試項目中,卻也發現不行。無奈之下,把復制到測試項目的web.config改成app.config,卻發現可以從app.config中正確讀出配置信息了。
相關約定:
1、如果是WEB應用程序,因為配置文件名必須為web.config,所以如果當前目錄下有web.config文件,就讀取當前目錄下的配置文件,如果當前目錄沒有則讀取根目錄下的配置文件。
2、如果是winform/wpf/控制台應用程序,則配置文件就是【程序名.exe.config】
這些都是.NET配置系統約定好的規則,更詳細的信息樓主可以使用reflector查看System.Web.Configuration.WebConfigurationManager和System.Configuration.ConfigurationManager兩個類的源代碼
3、如果是vs生成的單元測試項目,配置文件名必須是app.config。所以如果是在Web應用程序中運行單元測試,需要把web.config對應地修改成app.config。這樣單元測試項目才能正確地從配置文件中讀出相應的配置。因為單元測試是由測試項目運行的,當運行測試項目時,只是引用了我們的被測項目,所以是尋找測試項目的app.config文件
解決方法:
1.在測試項目中添加app.config文件,將被測項目的app.config文件中的內容復制到測試項目的app.config文件中(不推薦,需要維護兩份app.config文件)。如果是web應用程序,還需要將web.config重命名為app.config,才能正確被測試項目讀取。
2.在解決方案管理器中,右擊測試項目→添加→現有項,選擇被測項目的app.config文件,並選擇“添加為鏈接”(如果直接添加則和方法1無區別,等同於復制文件,需要維護兩個app.config文件,無法隨被測項目中的原文件進行更新)
3、修改測試項目的生成事件,以便能夠自動將web.config (或app.config)復制到測試項目的bin(輸出)目錄下。只需要簡單幾步即可
①右鍵點“測試項目”,選擇屬性
②點擊“生成事件”→在“后期生成事件命令行”的文本框中輸入
copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"
其中WebApplication1要替換成你被測試項目的名稱。
③按下“Ctrl+s”保存,這樣每次運行測試項目的時候,他就會從被測試項目中復制一份配置文件
參考網址:
Can a unit test project load the target application's app.config file?