تسمى كيفية تأكيد طريقة خاصة على فئة ملموسة (Typemock/Nmock/etc ..)؟

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

سؤال

أحاول كتابة اختبار وحدة لوظيفة "isunique" في الفصل أدناه والتي تبدو مثل هذا:

class Foo
{
    public bool IsUnique(params...)
    {
       ValidateStuffExists(params);
       return CheckUniqueness(params);
    }

    private void ValidateStuffExists(params)
    {
      //does some validation
    }

    private bool CheckUniqueness(params)
    {
       //does logic to determine if its unique per params
       return result;
    }

}

الشيء الوحيد الذي أريد اختباره هنا هو أن acidatestufxists و checkuniqueness يتم استدعاؤها وإقرار الحجج. هذا كل ما تفعله هذه الوظيفة ، كل ما سأختبره (سأثني القاعدة "اختبار السلوك العام فقط" واختبار الأساليب الخاصة هنا ، لأنها إما لها طريقة/اختبارات معقدة واحدة أو اختبار 2 خاص طُرق).

أنا منفتح على أي مكتبة سخرية. أستخدم Nmock ولم أكن أعتقد أن الأمر كان يتعلق بالمهمة - لذلك قمت بتنزيل Typemock عندما فعلت القراءة وسمعت أن هذا هو الأفضل وأنه يمكن أن يسخر من الفئات الملموسة / مكالمات طريقة الواجهة ...

أنا أفعل شيئًا كهذا في اختباري ويلقي استثناءً في خط "العزلة. whencalled":

        CrmEntityUniqueValidator_Accessor target = new CrmEntityUniqueValidator_Accessor(); // TODO: Initialize to an appropriate value
        DynamicEntity entity = null; // TODO: Initialize to an appropriate value
        string[] propertyNames = null; // TODO: Initialize to an appropriate value

        bool tru = true;
        Isolate.WhenCalled(() => target.CheckUniqueness(entity, propertyNames, null, null)).WillReturn(tru);

        target.ValidatePropertiesExist(entity, propertyNames);

        Isolate.Verify.WasCalledWithArguments(() => target.ValidatePropertiesExist(entity, propertyNames));
        Isolate.Verify.WasCalledWithArguments(() => target.CheckUniqueness(entity, propertyNames, null, null));

هذا يلقي استثناء مثل "*** whencled لا يدعم استخدام استدعاء طريقة كوسيطة."

على الرغم من أنني قادر على فعل الشيء نفسه مع فئة CLR - يمكنني الاستياء على DateTime.Now القيام بذلك (أعمال الرمز):

        DateTime endOfWorld = new DateTime(2012, 12, 23);
        Isolate.WhenCalled(() => DateTime.Now).WillReturn(endOfWorld);
        DateTime dt = DateTime.Now;

        Assert.AreEqual(dt, endOfWorld);

أي شخص لديه أي نصيحة هنا؟ هل يجب علي تقسيم هاتين الطريقتين إلى فئة منفصلة وجعل واجهة هي الطريقة الوحيدة؟ أو تعقيد طريقتي/الاختبارات ؟؟؟ يجب أن يكون هناك شيء أفتقده هنا ... شكرًا جزيلاً على أي مساعدة مقدمًا.

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

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

المحلول

حاول العزلة.

or Imploy.verify.nonpublic.wascalled (كائن ، "الطريقة" ..

نصائح أخرى

رينوموكس لديه AssertWasCalled الطريقة التي قد تخدم الغرض من ضمان أن الطريقة تستدعي طريقة أخرى ... لكنني لست متأكدًا من أنه يمكنك القيام بذلك في وظيفة خاصة من نفس الفئة التي تقوم باختبار الوحدة. أعتقد أنه لا يمكنك فعل ذلك إلا إذا كان الطريقتان اللتان تريدان أن تهدئهما في فصل تبعية آخر تم حقنه.

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