باستخدام مصنع لاستبدال مثيلات بمزيفة من إطار العزل

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

سؤال

قبل شهر انتهيت من قراءة كتاب "Art of Unit Testing" ، واليوم أتيحت لي وقتًا للبدء في استخدام وحيد القرن من خلال اختبار الوحدة خدمة ترسل/تتلقى رسائل إلى الأجهزة (UDP) وتحفظ/تحميل البيانات من قاعدة البيانات.
خارج المسار أريد عزل قاعدة البيانات واتصال UDP.

على سبيل المثال للوصول إلى قاعدة البيانات ، لدينا بعض الفئات ذات الأساليب الثابتة ، دعنا نسميها:

  • areaadbaccess
  • AREABDBACCESS
  • AreaCdBAccess

كانت هذه الفئات أساليب ثابتة نفذت الوصول إلى قاعدة البيانات.
لتكون قادرة على استخلاصهم ، جعلت أساليبهم عامة افتراضية.

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

public class ObjectFactory
{
    private static Dictionary<Type, object> Instances = new Dictionary<Type, object>();

    public static T GetInstance<T>() where T : new()
    {
        if(Instances.ContainsKey(typeof(T)))
            return (T)Instances[typeof(T)];

        return new T();
    }

    public static void SetInstance<T>(object obj)
    {
        Instances[typeof(T)] = obj;
    }
}

ثم على الكود ، يمكنني استخدام

private AreaADBAccess DBAccess = ObjectFactory.GetInstance<AreaADBAccess>();

وعلى طريقة الاختبار أفعل شيئًا مثل

AreaADBAccess dbAccess = mocks.Stub<AreaADBAccess>();
using (mocks.Record())
{
...
}
ObjectFactory.SetInstance<AreaADBAccess>(dbAccess);
//Invoke the test method
...

هذا هو الحل الأول وأدرك أنه يمكن القيام به بطريقة أفضل.
هل يمكنك الآن التعليق عليها وتوجهني إلى أفضل الممارسات؟
هل يمكنك أيضًا أن تشرح لي لماذا أرغب في الحصول على واجهة بدلاً من تحديد الأساليب على أنها افتراضية؟ يبدو من غير المجدي تكرار رؤوس الطريقة في مكانين.
شكرًا!

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

المحلول

ربما يمكنك الاستفادة من حاويات IOC مثل Windsor أو StructureMap أو Ninject ، مما يجعل حياتك أسهل بكثير ، وفي الواقع تعمل أيضًا كـ "مصنع" قمت بإنشائها يدويًا ، ولكنها أكثر قوة.

أيضًا ، هناك حاويات لسيارات ستقوم تلقائيًا بإنشاء تبعيات وهمية لفئاتك حتى تتمكن من حفظ خطوط إضافية من التعليمات البرمجية ، وجعل الاختبار أقل هشاشة.

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

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