سؤال

لدي Singleton التي يمكن الوصول إليها في صفي عبر خاصية ثابتة مثل هذا:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

أرغب في اختبار صفي باستخدام إحدى هذه الكائنات. هل هناك طريقة ل RhinoMocks لإرجاع كعب عندما يكون Getter الخاص بالملكية الثابتة Instance يسمى؟

أن تكون أكثر وضوحا، إليك رمز خاصية مثيل:

    /// <summary>
    /// Make a property to allow the OtherClassNotBeingTested class 
    ///   to be a singleton 
    /// </summary>
    public static OtherClassNotBeingTested Instance
    {
        get
        {
            // Check that the instance is null
            //  NOTE: COMMENTS BELOW HAVE SHOWN THIS TO BE BAD CODE.  DO NOT COPY
            if (mInstance == null)
            {
                // Lock the object
                lock (mSyncRoot)
                {
                    // Check to make sure its null
                    if (mInstance == null)
                    {
                        mInstance = new OtherClassNotBeingTested();
                    }
                }
            }

            // Return the non-null instance of Singleton
            return mInstance;
        }
    }

تحديث: هذه هي الطريقة التي انتهيت منها تحديدها:

class ClassBeingTested
{
    public ClassBeingTested(IGuiInterface iGui):this(iGui, Control.Instance)
    {

    }

    public ClassBeingTested(IGuiInterface iGui, IControl control)
    {
        mControl = control;

        //Real Constructor here
    }
}

اختبارات الوحدة الخاصة بي اتصل بالبناء الثاني. الرمز الفعلي يستدعي أول منشئ. يستخدم الرمز في الفصل الحقل المحلي mcontrol. بدلا من singleton. (أعتقد أن هذا يسمى حقن التبعية.)

كما قمت بتعويض Singleton حسب توني المهراقتراح.

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

المحلول

أتمنى لك mInstance يتم الإعلان عن المتغير على أنه متقلب، وإلا يتم كسر تطبيق DCL الخاص بك. على محمل الجد، هل تحتاج حقا إلى هذا المستوى من الكسل؟ أنا شخصيا أوصي بعض من أنماط أبسط المتاحة.

ومع ذلك، عندما يتعلق الأمر بالسخرية - لا، لا يمكنك خروج مكالمات ثابتة مع RhinoMocks. هناك بعض الأدوات المتاحة التي تسمح بذلك، مثل Typemock., ، ولكن شخصيا كنت أعد تشغيل التطبيق أن يكون أكثر اختبارا في المقام الأول.

خيار آخر هو الحصول على "الغش" Singleton حيث يمكنك تعيين قيمة خاصية Singleton في حالة الاختبار الخاصة بك. إذا قمت بإرجاع العقار واجهة بدلا من فئة Singleton نفسها، يمكنك استبدال Singleton الحقيقي باستخدام وهمية.

نصائح أخرى

على الرغم من الشائعات الأخرى، يمكنك أن تسخر من المفردات، انظر جوابي إلى:

كيفية وهمية singleton ثابت؟

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

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