如何在使用HostType("Moles")的测试中读取UnitTest项目的App.Config文件

12

我有以下这些测试:

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

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


一个很好的解决方法被提交到了我类似的问题:https://dev59.com/vV_Va4cB1Zd3GeqPY_sR - Nicholas Hill
我发现这个答案:https://dev59.com/Wm025IYBdhLWcg3wNTAV#6151688 是使用moles修改配置文件的最佳方法。如果您使用自定义配置部分,它可以完美地工作(实际上,在这种情况下,这是唯一一个可用的方法)。 - Jorge Vargas
6个回答

17

假设您正在尝试访问appSettings中的值,那么可以在测试开始时添加配置,例如:

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

当你的测试试图读取AppSettings中的“Key”时,“Value”将被返回。


1
哦,天啊。如果由我决定,我会把这个答案设为被采纳的答案!!!非常感谢你。这真是一个“doh”时刻。哈哈 - pqsk
4
如果有人对添加连接字符串感兴趣,我想补充说明一下,它的写法略有不同:ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings("name", "connectionstring"); - pqsk
非常成功。谢谢,Kipp。 - Crwydryn

12

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


3
有时候最简单的解决方案是最好的——对我来说,这比使用OpenExeConfiguration等方法要简单得多。 - noonand

6

3
根据链接,这是一个漏洞问题,正在处理中。只是为了让人们不必去那里阅读帖子。 - jcollum
这真的很糟糕。我们有一些集成测试,其中(不管好坏)测试的 app.config 实际上相当庞大。我被困在重新实现 ConfigurationManager/WebConfigurationManager 的工作中。 - BFree

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: The configuration section 'appSettings' has an unexpected declaration'。有什么解决方法吗? - Dennis
@Dennis,为了解决这个错误,请参考这里的示例代码:http://social.msdn.microsoft.com/Forums/is/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6 如果您没有任何自定义的appSettings,您可以只需“return new NameValueCollection();”。 - Rami A.

2
我在工作中遇到这个问题,但不喜欢任何一个答案。我还遇到了这样的问题,配置文件在静态构造函数中被读取,这意味着在执行静态构造函数之前无法使用Mole ConfigurationManager。
我在家庭电脑上尝试了一下,发现配置文件被正确读取了。原来我使用的是Pex 0.94.51006.1,在当前版本略旧。我找到了老版本的下载链接:http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx 我在工作电脑上安装了它,一切都正常工作。目前,我降级到旧版本,等待发布新的可用版本。

欢迎来到Stack Overflow。这是一个问答网站,而不是一个典型的论坛,因此在回答中发布问题不会得到适当的关注,也不适合该网站,因为对问题的回答应该只回答那个问题。通常我会建议您单独发布您的问题,但询问一个工具是否仍在开发中在这里是不相关的。这是一个最好由工具的开发人员回答的问题。谢谢。 - Adam Lear

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 部分 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接