سؤال

أواجه مشكلة في استخدام وحيد القرن لتأكيد أن الطريقة تم استدعاؤها (ومن الناحية المثالية مع معلمة معينة). الطريقة هي ilog.debug (formatmessageHandler) في Common.logging 2.0 باستخدام بناء جملة Lamba الجديد. إنه يعمل بشكل جيد باستخدام Way Old Plain Ilog.debug (سلسلة).

    // Sample Code to Test
    public int TestFuncLambda(ILog log, int a, int b)
    {
        log.Debug(m => m("TestFunc START"));

        int c = a + b;

        log.Debug(m => m("TestFunc END"));

        return c;
    }

    public int TestFunc(ILog log, int a, int b)
    {
        log.Debug("TestFunc START");

        int c = a + b;

        log.Debug("TestFunc END");

        return c;
    }

    [TestMethod]
    public void Should_log_start_TestFuncLamba()
    {
        var logger = MockRepository.GenerateMock<ILog>();

        logger.Stub(x => x.IsDebugEnabled).Return(true);

        TestFuncLambda(logger, 1, 2);

        // Doesn't work, says zero calls plus I'm not sure how to check for the word "START" in the string either
        logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());
    }

    [TestMethod]
    public void Should_log_start_TestFunc()
    {
        var logger = MockRepository.GenerateMock<ILog>();
        logger.Stub(x => x.IsDebugEnabled).Return(true);

        TestFunc(logger, 1, 2);

        // Works fine
        logger.AssertWasCalled(x => x.Debug(Arg<string>.Matches(Text.Contains("START"))));
    }
هل كانت مفيدة؟

المحلول 3

اكتشفتها. كنت في عداد المفقودين جزء العمل للمندوب. بناء الجملة المناسب هو:

logger.AssertWasCalled(x => x.Debug(Arg<Action<FormatMessageHandler>>.Is.Anything));

عوضا عن

logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());

كما ذكر O.InoreArguments () كانت زائدة عن الحاجة وليست ضرورية.

نصائح أخرى

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

بدون اختبار الكود الخاص بك ، يبدو هذا السطر أنه سيكون دائمًا صفرًا:

logger.AssertWasCalled(x => x.Debug(Arg<FormatMessageHandler>.Is.Anything), o => o.IgnoreArguments());

لأن الطريقة الفعلية testfunc () تمرر السلاسل إلى log.debug ، وليس formatmessageHandler:

لذلك سيكون من المنطقي أن يكون عدد المكالمات صفر. أضف خطًا إلى TestFunc () مثل هذا:

log.Debug(new FormatMessageHandler());

ومعرفة ما إذا كان ذلك يعمل.

أولاً ، قم بإنشاء فئة ملموسة لمعرفة ما إذا كان يتم استدعاء طريقة Debug () الصحيحة في TestFunClambda. هذا يتأكد من أنه لا يفعل نوعًا من التحويل الغريب لـ Lambda إلى سلسلة.

بمجرد التحقق من ذلك ، يجب أن يكون الاتصال بالإصدار الصحيح ، فقد عزلت المشكلة مع Rhinomocks. يمكن أن يكون خطأ مع وحيد القرن السخرية. لذلك ، يتيح تقليل مجموعة الفشل ولكن لف lambda في formatmessageHandler () قبل أن تنقلها إلى تصحيح. هذا يضمن أن يتم استدعاء الوظيفة الصحيح السخرية وعدم ترجمتها كشيء آخر.

إذا لم تجد خطأً في هذه المرحلة ، وما زال لا يعمل ، فحاول إنشاء مثيل لـ FormatMessageHandler () وحفظه كمتغير عضو ثابت (فقط لاختبار الخطأ). تمرير في ذلك المحفوظ في دعوة TestFuncDebug للتصحيح () ودعوة assertwascalled (). إذا لم ينجح ذلك ، فأنا خارج الأفكار.

راجع للشغل ، لا أعرف ما هي الجهل () ، لكن لم أضطر أبدًا إلى تسميتها في مكالمات الأنف الخاصة بي للتأمين. عادة ما يكون هناك arg <>.

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