Ответ 1
См. http://social.msdn.microsoft.com/Forums/en/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6
В то же время, как работа, вы можете попробовать добавить настройки конфигурации в Microsoft.Moles.VsHost.x86.exe.config
У меня следующие тесты:
[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 из второго теста?
Или может быть, я могу добавить другой файл конфигурации в другое место?
См. http://social.msdn.microsoft.com/Forums/en/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6
В то же время, как работа, вы можете попробовать добавить настройки конфигурации в Microsoft.Moles.VsHost.x86.exe.config
Предполагая, что вы пытаетесь получить доступ к значениям в appSettings, как насчет просто добавления конфигурации в начале вашего теста. Что-то вроде:
ConfigurationManager.AppSettings["Key"] = "Value";
Затем, когда ваш тест пытается прочитать "Ключ" AppSettings, "Value" будет возвращен.
Вы просто добавляете свой файл "App.Config" в проект unit test. Он будет автоматически читаться.
[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;
};
}
Я столкнулся с этой проблемой на работе и не любил ни одного из этих ответов. У меня также есть проблема, что файл конфигурации читается в статическом конструкторе, что означает, что я не могу Mole ConfigurationManager до выполнения статического конструктора.
Я попробовал это на своем домашнем компьютере и обнаружил, что файл конфигурации читается правильно. Оказывается, я использовал Pex 0.94.51006.1 дома. Это немного старше текущего. Мне удалось найти загрузку для более старой академической версии: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx
Я установил это на своем рабочем компьютере, и все работает отлично. На данный момент я понижаюсь до более старой версии, пока не будет выпущена более новая рабочая версия.
Это то, что я использую, чтобы получить правильные разделы 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 здесь