كيفية قراءة app.config من unittest Project من اختبار مع HostType ("Moles")

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

لقد واجهت هذه القضية في العمل ولم يعجبني أي من هذه الإجابات. لديّ أيضًا مشكلة في قراءة ملف التكوين في مُنشئ ثابت مما يعني أنني لا أستطيع 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 هنا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top