如何从主机类型(“摩尔”)的测试中读取单元测试项目App.Config

时间:2010-11-05 11:54:53

标签: c# unit-testing mstest moles

我有以下测试:

[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?

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

6 个答案:

答案 0 :(得分:17)

假设您正在尝试访问appSettings中的值,那么只需在测试开始时添加配置即可。类似的东西:

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

然后,当您的测试尝试读取AppSettings“Key”时,将返回“Value”。

答案 1 :(得分:12)

您只需将“App.Config”文件添加到单元测试项目中。它会自动读取。

答案 2 :(得分:6)

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

同时,作为解决方法,您可以尝试将配置设置添加到Microsoft.Moles.VsHost.x86.exe.config

答案 3 :(得分: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;
                };
    }

答案 4 :(得分:2)

我在工作中遇到过这个问题,并不喜欢这些答案。我还有一个问题,即在静态构造函数中读取配置文件,这意味着在执行静态构造函数之前我无法使用Mole ConfigurationManager。

我在家用电脑上试过这个,发现配置文件正在正确读取。事实证明我在家里使用的是Pex 0.94.51006.1。这比现在的略长。我能够找到旧版学术版的下载: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx

我在我的工作电脑上安装了这个,一切都很完美。此时,我正在降级到旧版本,直到发布更新的工作版本。

答案 5 :(得分: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