سؤال

عند الرجال وحدة اختبار أحد التطبيقات التي تعتمد على القيم من ملف app.config؟ كيف يمكنك اختبار أن تتم قراءة هذه القيم بشكل صحيح، وكيف يتفاعل البرنامج لقيم غير صحيحة دخلت في ملف التكوين؟

وسيكون من السخف أن تضطر إلى تعديل ملف التكوين عن التطبيق NUnit، ولكن لا أستطيع قراءة في القيم من app.config أريد أن اختبار.

وتحرير: أعتقد أنني يجب توضيح ربما. أنا لست قلقا حول ConfigurationManager فشلها في قراءة القيم، ولكني أشعر بالقلق مع اختبار رد فعل برنامجي لقيم قراءة في.

هل كانت مفيدة؟

المحلول

وأنا عادة عزل الاعتماد على الخارج مثل قراءة ملف التكوين الخاصة في الدرجة الواجهة مع وظائف قليلة جدا. في اختبارات يمكنني إنشاء نسخة وهمية من هذه الفئة التي تطبق واستخدام ذلك بدلا من ملف التكوين الحقيقي. يمكنك إنشاء نموذج بالحجم الطبيعي بنفسك أو استخدام إطار مثل موك أو وحيد القرن يسخر لهذا الغرض.

وبهذه الطريقة يمكنك محاولة بسهولة من التعليمات البرمجية الخاصة بك مع قيم التكوين المختلفة دون كتابة الاختبارات المعقدة التي الأول الكتابة ملفات XML التكوين. التعليمات البرمجية التي يقرأ التكوين هو عادة بسيطة بحيث يحتاج اختبار القليل جدا.

نصائح أخرى

ويمكنك تعديل قسم التكوين الخاص بك في وقت التشغيل في إعداد الاختبار. منها مثلا:

// setup
System.Configuration.Configuration config = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add("sectionname", new ConfigSectionType());
ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname");
section.SomeProperty = "value_you_want_to_test_with";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("sectionname");

// carry out test ...

ويمكنك من الإعداد بالطبع طرق المساعد الخاص بك للقيام بذلك أكثر أناقة.

ويمكنك استدعاء الأسلوب مجموعة من ConfigurationManager.AppSettings لتعيين القيم المطلوبة لهذا الاختبار وحدة معينة.

[SetUp]
public void SetUp()
{
  ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");
  // rest of unit test code follows
}

عند تشغيل اختبار وحدة فإنه سيتم ثم استخدام هذه القيم لتشغيل التعليمات البرمجية

ويمكنك من القراءة والكتابة إلى ملف app.config مع الطبقة ConfigurationManager

وكنت تواجه مشاكل مماثلة مع الملف web.config .... أجد حلا للاهتمام. يمكنك تغليف التكوين وظيفة القراءة، على سبيل المثال شيء من هذا القبيل:

public class MyClass {

public static Func<string, string> 
     GetConfigValue = s => ConfigurationManager.AppSettings[s];

//...

}

وبعد ذلك تستخدم عادة

string connectionString = MyClass.GetConfigValue("myConfigValue");

ولكن في اختبار وحدة تهيئة "تجاوز" وظيفة من هذا القبيل:

MyClass.GetConfigValue = s =>  s == "myConfigValue" ? "Hi", "string.Empty";

والمزيد حول هذا الموضوع:

HTTP: // rogeralsing. كوم / 2009 / 07/05 / إلى أبسط شكل من شكلي التبعية حقن /

وهناك حل أكثر أناقة هو استخدام عادي حقن التبعية القديمة على إعدادات التكوين أنفسهم. IMHO هذا هو أنظف من وجود للسخرية تكوين القراءة الطبقة / المجمع الخ.

وعلى سبيل المثال، ويقول فئة "الأحوال الجوية" يتطلب "ServiceUrl" من أجل وظيفة (على سبيل المثال يقولون انه يدعو خدمة الإنترنت للحصول على الطقس). وبدلا من وجود بعض سطر من التعليمات البرمجية التي تذهب بنشاط إلى ملف التكوين للحصول على هذا الإعداد (سواء كان هذا الرمز يكون في الدرجة الطقس أو قارئ تكوين منفصلة يمكن أن سخر حسب بعض الردود الأخرى)، والطبقة الطقس يمكن أن تسمح الإعداد ليتم حقنه، إما عن طريق معلمة إلى المنشئ، أو ربما عن طريق اضع الملكية. وبهذه الطريقة، وحدة الاختبارات هي بسيطة للغاية ومباشرة، وحتى لا تتطلب ساخرا.

ويمكن بعد ذلك يتم حقنه قيمة الإعداد باستخدام عكس من التحكم (أو التبعية حقن) حاوية، وبالتالي فإن المستهلكين من الطبقة الطقس لا تحتاج إلى توفير صراحة القيمة من مكان ما، كما انها التعامل معها من قبل الحاوية.

والتي عملت بالنسبة لي:

 public static void BasicSetup()
  {
     ConnectionStringSettings connectionStringSettings = 
          new ConnectionStringSettings();
     connectionStringSettings.Name = "testmasterconnection";
     connectionStringSettings.ConnectionString = 
          "server=localhost;user=some;database=some;port=3306;";
     ConfigurationManager.ConnectionStrings.Clear();
     ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);
  }

ويمكنك لف دائما القراءة في بت في واجهة، ويكون التنفيذ المحدد القراءة من ملف التكوين. هل ثم كتابة الاختبارات باستخدام كائنات وهمية لنرى كيف التعامل مع البرنامج القيم السيئة. شخصيا، أنا لن اختبار هذه محددة للتنفيذ، وهذا هو رمز برنامج .NET Framework (وأفترض - ونأمل - وMS اختبرت بالفعل).

وSystem.Configuration.Abstractions هو شيء من الجمال عندما يتعلق الأمر اختبار هذا النوع من الاشياء.

وهنا هو موقع المشروع جيثب مع بعض الأمثلة الجيدة: إدخال وصف الرابط هنا

وهنا هو موقع NuGet: https://www.nuget.org/packages /System.Configuration.Abstractions/

وأنا استخدم هذا تقريبا في جميع المشاريع. NET بلدي.

والواقع، والتفكير في أكثر من ذلك، أعتقد أن ما يجب أن أقوم به هو إنشاء فئة ConfigFileReader لاستخدامها في مشروعي ثم أنها وهمية في تسخير وحدة الاختبار؟

هل هذا هو الشيء المعتاد أن تفعل؟

والخيار الأبسط هو التفاف الأساليب التي قراءة التكوين بحيث يمكنك استبدال في القيم أثناء الاختبار. إنشاء واجهة التي تستخدمها لقراءة التكوين ولها تنفيذ تلك الواجهة الحصول على تمرير في كمعلمة منشئ أو تعيين على وجوه كخاصية (كما لو كنت تستخدم حقن التبعية / انعكاس السيطرة). في بيئة الإنتاج، تمر في تنفيذ الذي يقرأ حقا من التكوين. في بيئة اختبار، تمر في تنفيذ الاختبار التي تقوم بإرجاع قيمة معروفة.

إذا لم يكن لديك خيار إعادة بيع ديون رمز للقابلية الاختبار حتى الآن لا تزال بحاجة لاختباره، Typemock المعزل يوفر القدرة على السخرية من الواقع الطبقات تكوين إطار .NET بحيث تستطيع أن تقول فقط "في المرة القادمة أنا أسأل لمثل -و-هذه القيمة appSettings، تعود هذه القيمة المعروفة ".

وكان لي نفس المشكلة،

ويمكنك استخدام Nunit-console.exe ج: \ path1 \ testdll1.dll ج: \ path2 \ testdll2.dll

وهذا يعمل بشكل جيد على الرغم من إذا تشير كل من دلس إلى app.configs مختلفة testdll1.dll.config السابق وtestdll2.dll.config

وإذا كنت ترغب في استخدام Nunit مشروع التهيئة والتفاف هذه دلس اثنين ثم لا توجد وسيلة يمكن أن يكون اثنين من التكوينات

ويكون لديك project1.config إذا تم project1.nunit مشروع Nunit في نفس الموقع كما يجلس Project1.nunit.

ويساعد هذا الأمل

حسنا، أنا فقط كان نفس المشكلة ... أردت أن اختبار مشروع BL المشار إليها من موقع على شبكة الإنترنت. ولكن أردت أن اختبار BL فقط. حتى في حالة ما قبل الإنشاء المشروع اختبار I نسخ الملفات إلى مجلد app.Config بن \ التصحيح والرجوع إليها من app.config ...

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