2017-03-11 54 views
0

我周圍搜索,沒有答案爲我工作。我有2個ASP.NET項目,其中一個是我的項目,另一個是包含單元測試的項目。C#在單元測試中注入ConfigurationManager

# Projects 
Project.Core 
    ... 
    secretConnectionStrings.config 
    Web.config 

Project.Tests 

Project.Core,我有一個請求都連接字符串(從secretConnectionStrings.config和應用程序從web.config文件中的設置。執行它自己的方法,正確的價值觀都來自這些配置文件的拉不過,我想我的單元測試中測試這

我的測試看起來像這樣(內Project.Tests):

[TestClass] 
public class TestUserController 
{ 
    [TestMethod] 
    public void Post_ShouldReturnNewUser() 
    { 
     var controller = new UserController(); 

     var result = controller.Post() as User; 
     Assert.AreNotEqual(result, null); 
    } 
} 

線它炸彈出來是這樣的

string cacheConnection = ConfigurationManager.ConnectionStrings["RedisCache"].ConnectionString; 

System.NullReferenceException:對象引用未設置到對象

我已經嘗試添加web.configsecretConnectionStrings.config在我Project.Tests解決方案的鏈接的一個實例。這沒有奏效,我不想接口到我的web.config(我想要的值,因爲它們保存在Project.Core)。有沒有一種解決方案,我可以從Project.Core的web.config中將值抽取到我的單元測試中?

+0

你的單元測試是在單獨的項目。您必須在該項目中添加連接字符串。 – kat1330

+0

有沒有辦法訴諸於此?我不想通過爲2個項目維護兩組配置文件來引入另一個可能失敗的問題 – Zac

+0

您是否考慮過爲ConfigurationManager創建一個包裝類,在真實代碼中使用包裝,然後在單元測試中僞造包裝? – lilactiger89

回答

1

包含單元測試的項目將需要ConfigurationManager自己的配置文件來提取連接字符串。設置此將只保留1個在配置文件的副本,最好的辦法是到同一個文件添加到每個需要的項目,但將其添加爲鏈接文件:

Add Linked File

唐「別忘了設置文件屬性,使其與可執行代碼部署: Build Action

,將其作爲部署項目添加到您的測試夾具(S):

[TestClass] 
[DeploymentItem(@"db.config")] 
public class MyTestFixture { ... } 

現在,如果你想有兩個不同名稱的配置文件(app.config & web.config),那麼你可以將它們放在第三個文件db.config和該文件導入其他每個配置文件的集中連接字符串:

db.config

<connectionStrings> 
    <add name="testDb" connectionString="data source=(localdb)\v11.0;..." 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 

的app.config/web.config中

<connectionStrings configSource="db.config" /> 

除了app.config或web.config之外,請務必爲導入的配置文件設置「複製到輸出目錄」,並將它們作爲部署項添加到具有該屬性的測試夾具中。

+0

有沒有辦法將這個配置文件的內容放在'app.config'中?測試項目有它的配置文件,如果鏈接的文件被命名爲'web.config',那麼這些更改是否會正確地取回? – Zac

+0

我跟着你的例子,並得到相同的錯誤。我相信這是因爲單元測試正在尋找'app.config',我不能使用配置文件的不同名稱。 – Zac

+0

答案已經更新,以解決不同的命名配置文件。 –