如何使用主机类型(“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的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 单元测试:读取数据(输入)文件