سؤال

بادئ ذي بدء، أنا أدرك أن هذا السؤال قريب بشكل خطير من:كيفية mappath في اختبار الوحدة في C #

آمل أن يكون ذلك حلا مختلفا. يلي مشكلتي:

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

نظرا لأن MapPath موجود في رمز التحقق من الصحة، وليس اختبار وحدتي، كيف يمكنني الحصول على اختبار وحدتي للتعرف على المسار؟ هل هذا السؤال معنى؟

خط الخطأ (في رمز التحقق الخاص بي وليس اختبار الوحدة الخاص بي):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

المبسطة: يستدعي اختبار الوحدة طريقة في برنامجي الذي يستدعي Server.Mappath الذي فشل بعد ذلك.

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

المحلول

وأود أن أخرج "مزود اسم الملف" في فئة تعيد ببساطة موقعا، ثم يمكنك أن تسخر من ذلك كثيرا، أسهل بكثير.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

ثم، يمكنك إما استخدام فئة PathProvider مباشرة ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

أو وهم يسخرون في الاختبارات الخاصة بك:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

نصائح أخرى

بعد بعض googling صارم وبعض المساعدة من زميل وصلنا إلى حل بسيط بنيت بالفعل في .NET

أعلى اختبارات الوحدة التي تصل إلى عملية التحقق من الصحة، أضفت:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

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

حاول استخدام استخدام أكشن الأسماط أو إطار بديل للسخرية لسخرية HTTPCONTEXT (أو الأشياء الأخرى التابعة) أو يمكنك كتابة كائناتك الخاصة. أو اكتب فئة MapPathwrapper، ورث من فئة MapPathwrapperbase لبيئتك الحقيقية، ثم في اختبارات وحدتك إنشاء كائن MockMappathWrapper.

يجب أن يكون هناك الكثير من الأمثلة للسخرية على ذلك.

هنا واحد سألت:

كيفية استخدام أكرينو الأسماك إلى وهمية httpcontext.application

تحديثليس لدي فقط تجربة القيام بذلك مع ASP.NET MVC، مع WebForms I ImageIN، سيكون الأمر أكثر صعوبة كثيرا بسبب عدم وجود فئة HttpContextBase.

أود أن استخراج الأساليب التي قبول تبعياتك كحجج:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

يمكنك بعد ذلك اختبار الطرق المختلفة بشكل مستقل. على سبيل المثال، اختبار كيف ValidatePath() يعالج ملف مفقود.

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