Как прочитать Unittest Project app.config от теста с hosttype ("молью")

StackOverflow https://stackoverflow.com/questions/4105604

  •  29-09-2019
  •  | 
  •  

Вопрос

У меня есть следующие тесты:

[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

Другие советы

Предполагая, что вы пытаетесь получить доступ к значениям в приложениях, как насчет просто добавления конфигурации в начале вашего теста. Что-то вроде:

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

Затем, когда ваш тест пытается прочитать приложение «ключ», «значение» будет возвращена.

Вы просто добавляете свой файл "app.config" в проект для тестового модуля. Он будет читать автоматически.

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

Видел часть соединения здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top