如何使用主机类型(“Moles”)从测试中读取单元测试项目 App.Config

Posted

技术标签:

【中文标题】如何使用主机类型(“Moles”)从测试中读取单元测试项目 App.Config【英文标题】:How To Read UnitTest Project's App.Config From Test With HostType("Moles") 【发布时间】:2011-05-05 13:43:08 【问题描述】:

我有以下测试:

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

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

【问题讨论】:

向我的类似问题提交了一个很好的解决方法:***.com/questions/9117248/… 我找到了这个答案:***.com/a/6151688/13390 是使用 moles 时更改配置文件的最佳方式。如果您使用自定义配置部分(实际上,它是唯一在这种情况下有效的部分),它会很好地工作。 【参考方案1】:

假设您正在尝试访问 appSettings 中的值,那么在测试开始时添加配置怎么样。比如:

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

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

【讨论】:

天哪。如果由我决定,我会将其作为公认的答案!!!太感谢了。这是一个非常好的时刻。大声笑 只是想添加给任何有兴趣添加连接字符串的人有点不同:ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings("name", "connectionstring"); 辛苦了。谢谢,基普【参考方案2】:

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

【讨论】:

有时最简单的解决方案是最好的——这对我有用,而不是用 OpenExeConfiguration 之类的东西到处乱跑......【参考方案3】:

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

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

【讨论】:

根据链接,这是一个错误,正在处理中。只是这样人们就不必去那里阅读主题了。 这真的很糟糕。我们有一些集成测试,其中(无论好坏)测试 app.config 实际上非常大。我被困在重新实现 ConfigurationManager/WebConfigurationManager。【参考方案4】:
    [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;
                ;
    

【讨论】:

看起来很有希望模拟 ConfigurationManager,但如果我使用它来获取 appSetting,则会发生以下错误:'System.Configuration.ConfigurationErrorsException:配置部分 'appSettings' 有意外声明'。有什么解决办法吗? @Dennis,要解决该错误,请参阅此处的示例代码:social.msdn.microsoft.com/Forums/is/pex/thread/… 如果您没有任何自定义 appSettings,您可以“返回新 NameValueCollection();”跨度> 【参考方案5】:

我在工作中遇到了这个问题,并且不喜欢这些答案中的任何一个。我还有一个问题是在静态构造函数中读取配置文件,这意味着在执行静态构造函数之前我不能 Mole ConfigurationManager。

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

我将它安装在我的工作计算机上,一切正常。在这一点上,我正在降级到旧版本,直到发布更新的工作版本。

【讨论】:

欢迎来到 Stack Overflow。这是一个问答网站,而不是典型的论坛,因此将问题作为答案的一部分发布不会引起适当的关注,也不适合该网站,因为对问题的回答应该只解决该问题.通常我会建议您单独发布您的问题,但询问是否仍在开发工具是题外话。这是一个最好向该工具的开发人员提出的问题。谢谢。【参考方案6】:

这是我用来获取正确 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

【讨论】:

以上是关于如何使用主机类型(“Moles”)从测试中读取单元测试项目 App.Config的主要内容,如果未能解决你的问题,请参考以下文章

如何使用apache poi从公式单元格中读取单元格值

Android Studio 单元测试:读取数据(输入)文件

Moles 在静态构造函数中不起作用

OleDbDataReader 如何读取数字类型?

使用 NUnit 对 app.config 文件进行单元测试

如何对一个扩展了抽象类的类进行单元测试,读取环境变量。