2012-02-02 45 views
3

我們具有達網絡配置文件(如的app.config和web.config中)經由單元測試中訪問信息的問題當單元測試具有主持人類型的「鼴鼠」。這引起了很多頭痛,所以我希望有人對可以做什麼有一個想法。無法訪問從配置文件的信息的主機類型「摩爾」

我們使用Visual Studio 2010,我相信我們已經安裝了VS 2010 SP1和機器沒有安裝SP1,以及嘗試它在32位和64位的機器上試過這樣的機器上。

我冒昧地將測試簡化爲最簡單的條款。通過組成由以下兩個文件組成的單元測試項目,並在取消註釋唯一註釋行後運行測試,可以重新創建該問題。該測試在沒有主機類型的情況下工作,但是當您將Moles引入主機類型時,測試中的null斷言失敗。我們不知道爲什麼。

首先,配置文件的App.config:

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
    <add name="Connection" connectionString="Something" /> 
    </connectionStrings> 
</configuration> 

接下來,包含單個測試的測試類:

namespace TestProject 
    { 
    using System.Configuration; 
    using Microsoft.VisualStudio.TestTools.UnitTesting; 

    [TestClass] 
    public class UnitTest 
     { 

     [TestMethod] 
     //[HostType("Moles")] 
     public void TestMethod() 
      { 
      var data = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
      Assert.IsNotNull(data.ConnectionStrings.ConnectionStrings["Connection"]); 
      } 

     } 

    } 

我將不勝感激,如果有人可以提供任何見解。

非常感謝,

尼克

+0

可能的重複[如何閱讀UnitTest項目的App.Config從測試與HostType(「痣」)](http://stackoverflow.com/questions/4105604/how-to-read-unittest-projects-app- config-from-test-with-hosttypemoles) – NotMe 2012-02-05 01:21:30

+0

另請參閱我的類似問題http://stackoverflow.com/questions/8859087/moles-v0-94-causing-tests-to-ignore-config-file – sfuqua 2012-02-11 23:38:01

回答

1

我不知道這是否會做工作,但你可以嘗試以下解決方法:使用一個文件映射打開配置。 代碼將是這樣的:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
fileMap.ExeConfigFilename = configurationFilePath; 
System.Configuration.Configuration configuration = 
    ConfigurationManager.OpenMappedExeConfiguration(
     fileMap, 
     ConfigurationUserLevel.None); 
1

任何要執行單元測試,應用程序和用戶設置應該通過依賴注入傳遞時間。這是通過爲設置創建存根來完成的,這很容易實現。

  1. 在被測試的項目中創建一個接口,該接口包含每個配置設置的屬性。讓我們稱之爲「ISettings」,以供參考。

  2. 創建實現接口的目標組件的存根(類)。存根中的每個屬性應該只包含一個從配置文件返回相應設置的get。我們將這個存根稱爲「SettingsStub」。該存根由目標組件在生產環境中使用。

  3. 添加ISettings輸入參數傳遞給目標類型(類被測試)構造。目標類中的字段必須設置爲傳遞給構造函數的ISettings對象。您可以創建一個重載構造函數,並根據一些設計模式(MVVM等)的要求保留默認的構造函數。默認的構造函數(沒有參數的構造函數)可能只是實例化一個新的SettingsStub,用於生產。 測試必須始終使用重載構造函數!

  4. 創建設置存根的測試項目中,也實現ISettings。我們將其稱爲TestSettingsStub。該存根包含大多數測試可接受的硬編碼值。

  5. 重建目標和測試項目。 Moles生成名爲SISettings的存根類型。

使用具體的TestStyingsStub,當你不需要調整任何設置值。或者,當需要調整一個或兩個測試的值時,使用Miles Stub類型。 Moles Stub類型的目的是爲了避免需要創建包含一個或兩個獨特更改的許多存根。

當調用重載構造函數時,SettingsStub,TestSettigsStub和SISettings類型可以互換使用。現在,您可以完全控制每種環境下使用的設置,而無需在測試期間切換邏輯或手動更改設置值。目標代碼只是從本地字段中檢索設置值,而不是直接從配置文件中檢索。請參考依賴注入和控制反轉(IOC)主題。

像往常一樣,爲了安全起見,您的開發工作站的開發無法訪問生產網絡上的外部依賴系統(數據庫等)!

快樂編碼!

+0

Downvoting因爲while點1是好的,除此之外的任何東西都不是。鼴鼠對於這種方法來說是過度的,並不是它的目的。在這種情況下,一個簡單的模擬框架,如Moq就足夠了。 痣應該用於你*不能*模擬的代碼,例如文件系統訪問,數據庫調用等......這些都是單元測試而不是集成測試。 – dotnetnate 2012-02-06 06:21:02

+0

@dotnetnate我不主張使用一個簡單的依賴注入情況的模擬框架。然而,使用已經在使用的模擬框架的存根功能沒有任何問題。 – 2012-02-12 22:33:48

+0

@dotnetnate我不明白如何使用痣是一個不好的選擇用於測試。畢竟,這是一個嘲弄和殘缺的框架。我甚至會說使用Moq更容易,特別是對於小型項目;因爲,通過一個lambda寫一個繞道比建立一個Moq對象要快,並且達到相同的目的。當一個人已經僱用Moles的時候,爲什麼當他們都做同樣的工作時也使用Moq? – 2012-02-12 22:55:19

0

我同意Mike的回答在邏輯上是正確的(也就是說,你沒有將你的配置從類加載 - 可能),實際問題是對於Moles主機類型,根據你的原始問題,你需要將呼叫撥入配置系統,例如

MConfigurationManager.AllInstances.OpenExeConfiguration (... finish your moleing here...) 

語法是近似的 - 我不記得在這種情況下是否最終得到SConfigurationManager或MConfigurationManager。

我完全不同意Mike的觀點是,「...開發工作站無法訪問外部依賴系統......」這個陳述令人恐懼。我們將這些東西稱爲集成測試。

是的,您作爲開發人員應該創建它們。在某些時候,您將編寫涉及具體實現(例如數據庫,支持服務等)的代碼,如果您沒有測試該交互,那麼您幾乎做錯了。

+0

單元測試應該只測試目標代碼,沒有別的。集成測試當然應該測試與其他代碼和外部資源的交互(我不是白癡)。我的印象是這是一個關於單元測試的問題,而不是集成測試。如果這是一個單元測試的問題,那麼你的問題就是「單調乏味的建議」。單元和集成測試是相互排斥的。而且,當你有同樣的能力提供不好的建議時,沒有必要拍攝其他人。 – 2012-02-12 23:01:31

+1

請閱讀我的回覆。看來我們都需要更仔細地閱讀對方。我明確區分了單元測試和集成測試。我的錯誤是在閱讀你的建議中的「......生產網絡」部分。與談話很大程度上無關,並且可能是一個潛在的超負荷的術語,但我會一瘸一拐地假設你只是瞄準生產SOR。 – dotnetnate 2012-02-13 20:02:54

+0

我同意。上下文對於程序員之間的溝通是一種相當狡猾的損害。打的好。我向你傾訴我的帽子,好的先生。 – 2012-02-13 22:13:23