2010-11-05 47 views
12

我有如下因素測試:如何閱讀單元測試項目的App.Config中從試驗用HOSTTYPE(「痣」)

[TestClass] 
public class GeneralTest 
{ 
    [TestMethod] 
    public void VerifyAppDomainHasConfigurationSettings() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 

    [TestMethod] 
    [HostType("Moles")] 
    public void VerifyAppDomainHasConfigurationSettingsMoles() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 
} 

它們之間唯一的區別是[HostType("Moles")]。但第一次通過,第二次失敗。我如何從第二個測試中讀取App.config?

或者我可以在其他地方添加一些其他配置文件?

+0

一個偉大的解決辦法提交給我類似的問題: http://stackoverflow.com/questions/9117248/cant-access-information-from-configuration-files-when-tests-have-host-type -mol – 2012-02-06 12:05:37

+0

我發現這個答案:http://stackoverflow.com/a/6151688/13390是使用摩爾時更改配置文件的最佳方式。如果使用自定義配置節(實際上,它是唯一一個在這種情況下工作的節),它的工作效果非常好。 – 2012-12-14 06:36:41

回答

6

http://social.msdn.microsoft.com/Forums/en/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6

與此同時,作爲一種解決方法,你可以嘗試添加配置設置來Microsoft.Moles.VsHost.x86.exe.config

+3

根據鏈接,這是一個錯誤,正在努力。就這樣,ppl不必去那邊讀線。 – jcollum 2010-12-08 16:52:37

+0

這真的很糟糕。我們有一些集成測試,其中(好或壞)測試app.config實際上非常大。我卡住重新實現ConfigurationManager/WebConfigurationManager。 – BFree 2011-08-17 15:08:54

5
[ClassInitialize] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     System.Configuration.Moles.MConfigurationManager.GetSectionString = 
      (string configurationName) => 
       { 
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
        Assembly assembly = Assembly.GetExecutingAssembly(); 
        fileMap.ExeConfigFilename = assembly.Location + ".config"; 
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
        object section = config.GetSection(configurationName); 
        if (section is DefaultSection) 
        { 
         ConfigurationSection configurationSection = (ConfigurationSection) section; 
         Type sectionType = Type.GetType(configurationSection.SectionInformation.Type); 
         if (sectionType != null) 
         { 
          IConfigurationSectionHandler sectionHandler = 
           (IConfigurationSectionHandler)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(sectionType.Assembly.FullName, sectionType.FullName); 
          section = 
           sectionHandler.Create(
            configurationSection.SectionInformation.GetParentSection(), 
            null, 
            XElement.Parse(configurationSection.SectionInformation.GetRawXml()).ToXmlNode()); 
         } 
        } 

        return section; 
       }; 
    } 
+1

看起來有希望這ConfigurationManager的模擬,但如果我使用它來獲取appSetting,會發生以下錯誤:'System.Configuration.ConfigurationErrorsException:配置節'appSettings'有一個意外的聲明'。任何解決這個問題? – Dennis 2011-12-20 16:12:13

+0

@Dennis,要解決該錯誤,請參閱此處的示例代碼:http://social.msdn.microsoft.com/Forums/is/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6 如果您不願意沒有任何自定義的appSettings,你可以「返回新的NameValueCollection();」 – 2014-01-20 07:53:27

2

我碰到這個跑問題在工作中,並不喜歡任何這些答案。我也有配置文件正在讀取靜態構造函數的問題,這意味着我不能在執行靜態構造函數之前Mole ConfigurationManager。

我在家用電腦上試過這個,發現配置文件被正確讀取。原來我在家使用Pex 0.94.51006.1。這比現在的稍舊。我能夠找到較舊的學術版本的下載: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx

我在我的工作計算機上安裝了它,並且一切正常。此時,我要降級到較舊的版本,直到發佈一個更新的工作版本。

+0

歡迎來到Stack Overflow。這是一個問答網站,不是一個典型的論壇,所以發佈問題作爲答案的一部分不會得到適當的關注,也不適合網站,因爲對問題的回答應該只是解決這個問題。通常我會建議你單獨發佈你的問題,但是詢問一個工具是否仍在開發之中,這裏是無關緊要的。這是最適合該工具開發人員的問題。謝謝。 – 2011-12-31 01:53:16

17

假設您嘗試訪問appSettings中的值,那麼只需在測試開始時添加配置即可。例如:

ConfigurationManager.AppSettings["Key"] = "Value"; 

然後,當您的測試嘗試讀取AppSettings「Key」時,將返回「Value」。

+0

哦,我的。如果它取決於我,我會讓這個接受的答案!非常感謝。這是一個這樣的時刻。 lolz – pqsk 2012-02-17 14:14:20

+3

只是想添加到任何有興趣的人添加一個連接字符串是有點不同: ConfigurationManager.ConnectionStrings.Add(新的ConnectionStringSettings(「名稱」,「connectionstring」); – pqsk 2012-02-17 14:28:09

+0

謝謝,基普:) – 2013-04-18 19:45:07

0

這是我使用,以獲得正確的AppConfig和ConnectionString的部分內容:

var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(Reflection.Assembly.GetExecutingAssembly().Location); 

typeof(Configuration.ConfigurationElementCollection).GetField("bReadOnly", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(System.Configuration.ConfigurationManager.ConnectionStrings, false); 
foreach (Configuration.ConnectionStringSettings conn in config.ConnectionStrings.ConnectionStrings) 
    System.Configuration.ConfigurationManager.ConnectionStrings.Add(conn); 

foreach (Configuration.KeyValueConfigurationElement conf in config.AppSettings.Settings) 
    System.Configuration.ConfigurationManager.AppSettings(conf.Key) = conf.Value; 

鋸的ConnectionString部分here

11

你只要將你的「App.Config中」文件到單元測試項目。它會自動讀取。

+3

有時最簡單的解決方案是最好的 - 這對我而言並不是所有的OpenExeConfiguration和類似的東西... – noonand 2013-02-19 11:28:37

+0

它沒有爲我工作:( – cbillowes 2014-06-05 14:46:46

相關問題