2010-11-05 48 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

相关问题