سؤال

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

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

سيكون من الجيد أن تكون قادرًا على إخبار Intellisense بعدم إظهار الوظيفة ، على سبيل المثال.

أفضل حل لدي في الوقت الحالي هو مجرد تسمية الوظيفة مثل: DangerousSet ().

ما هي الخيارات الأخرى التي لدي؟

متابعة

لقد وجدت إجابة David B أكثر فائدة لموقفي. شكرًا!
كان اقتراح Mufasa لاستخدام التفكير رائعًا ، ولكن من الصعب تنفيذها (بالنسبة لي).
كان اقتراح كريس لاستخدام ديكور جيدًا ، لكنه لم يخرج.
اقتراح Bfree بشأن XML جيد أيضًا ، وكان مستخدمًا بالفعل ، لكنه لا يحل المشكلة حقًا.

أخيرًا ، اقتراح Billthelizard بأن المشكلة في المستندات المصدر ليس شيئًا يمكنني التحكم فيه. ينشر الخبراء الدوليون كتبًا تقنية للغاية ومقالات مجرية لاستخدامها من قبل مجتمعهم. حقيقة أنهم لا يعالجون احتياجاتي الخاصة هي حقيقة الحياة. ببساطة لا توجد مستندات بديلة.

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

المحلول

لنفترض أنك تريد اختبار هذا الكائن عن طريق معالجة حقوله.

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

ضع هذا الكائن في مجموعة الاختبار/مساحة الاسم:

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

واكتب الاختبار الخاص بك:

    public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

ملاحظة: أعلم أنك قلت داخلي, ، لكنني لا أعتقد أنك تعني داخلي.

نصائح أخرى

يمكنك استخدام internalsvisibletoatribute لوضع علامة على الأعضاء الداخلية على أنها واضحة لمجموعة الاختبار. يبدو أنه يلمع عند استخدامه في هذا السياق ، على الرغم من أنه ليس "صديقًا" تمامًا.

  1. بمناسبة الخاص بك DangerousSet وظيفة internal بدلاً من public.

  2. في الخصائص AssemblyInfo.cs للمشروع المحتوي DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

إذا كان لديك مجموعتان اختبار لأي سبب من الأسباب ، فإن بناء الجملة هو:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

تزيين طريقتك بهذه السمة:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

هذا سوف يخفيها من Intellisense.

تعديل:

ولكن يبدو أن هذا له تحذير مهم إلى حد ما: "في المرئي C#، EditorBrowsableAttribute لا يقمع الأعضاء من فصل في نفس الجمعية. " عبر MSDN.

يبدو أن مشكلتك الحقيقية في المستندات المرجعية. يجب ألا تختبر الحالات التي يستحيل مواجهتها تحت الاستخدام السليم لفصلك. إذا لم يُسمح للمستخدمين بتغيير حالة هذه المتغيرات ، فلن يكون هناك اختباراتك.

يمكنك أيضا استخدام الانعكاس. ظهر بحث Google وحدة اختبار الأساليب الخاصة باستخدام الانعكاس.

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

ما قمت به في الماضي هو وضع تعليقات XML بالطريقة واستخدمت القسم للكتابة بأحرف غامقة كبيرة. لا تستخدم هذه الطريقة أو أيا كان. وبهذه الطريقة ، إذا حاول شخص ما استخدامه ، فإن Intellisense سيمنحهم تحذيرًا لطيفًا.

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